sql >> データベース >  >> RDS >> Mysql

MySQL特定のステータスの2つの日付の間に欠落している日付を入力します

    計画

    セットアップ

    drop table if exists calendar_t;
    CREATE TABLE calendar_t (
      id integer primary key auto_increment not null,
      `date` date not null,
      day varchar(9) not null,
      month varchar(13) not null,
      `year` integer not null
    );
    
    drop view if exists digits_v;
    create view digits_v
    as
    select 0 as n
    union all
    select 1
    union all
    select 2
    union all
    select 3
    union all
    select 4
    union all
    select 5
    union all
    select 6
    union all
    select 7
    union all
    select 8
    union all
    select 9
    ;
    
    insert into calendar_t
    ( `date`, day, month, `year` )
    select 
    date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day) as `date`,
    dayname(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as day,
    monthname(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as month,
    year(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as `year`
    from
    digits_v a2
    cross join digits_v a1
    cross join digits_v a0
    order by date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)
    ;
    
    drop table if exists example;
    create table example
    (
      `date` date not null,
      status varchar(23) not null
    );
    
    insert into example
    ( `date`, status )
    values
    ( '2015-06-01',  'Start'   ),
    ( '2015-06-03',  'Stage 2' ),
    ( '2015-06-07',  'Stage 3' )
    ;
    

    クエリ

    select cal_date, mdate, ex2.status
    from
    (
    select cal_date, max(ex_date) as mdate
    from
    (
    select cal.`date` as cal_date, ex.`date` as ex_date
    from calendar_t cal
    inner join example ex
    on ex.`date` <= cal.`date`
    ) maxs
    group by cal_date
    ) m2
    inner join example ex2
    on m2.mdate = ex2.`date`
    -- pick a reasonable end date for filtering..
    where cal_date <= date('2015-06-15')
    order by cal_date
    ;
    

    出力

    +------------------------+------------------------+---------+
    |        cal_date        |         mdate          | status  |
    +------------------------+------------------------+---------+
    | June, 01 2015 00:00:00 | June, 01 2015 00:00:00 | Start   |
    | June, 02 2015 00:00:00 | June, 01 2015 00:00:00 | Start   |
    | June, 03 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
    | June, 04 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
    | June, 05 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
    | June, 06 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
    | June, 07 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 08 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 09 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 10 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 11 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 12 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 13 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 14 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    | June, 15 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
    +------------------------+------------------------+---------+
    

    sqlfiddle

    参照



    1. SQLServerデータをCSVファイルにエクスポートする

    2. MS Accessのクラッシュに問題がありますか?これらのソリューションを最初に試す

    3. MySQLストアドプロシージャまたはPHPコード?

    4. SQLの順序:プロのようにデータを並べ替える5つの推奨事項と禁止事項