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

mysqlは以前の値で欠落している日付を生成します

    MySQL 8の場合:

    with recursive rcte(dt_id, col, value) as (
      (
        select dt_id, col, value
        from mytable
        order by dt_id
        limit 1
      )
      union all
      select r.dt_id + interval 1 day
           , coalesce(t.col, r.col)     
           , coalesce(t.value, r.value)
      from rcte r
      left join mytable t on t.dt_id = r.dt_id + interval 1 day
      where r.dt_id < (select max(dt_id) from mytable)
    )
    select r.col, r.dt_id, r.value
    from rcte r
    order by r.dt_id
    

    db-fiddle

    再帰クエリは、最初の日付から最後の日付まで日付を増分して行ごとに構築します。 value (およびcol )は、日付に結合されたままの元のテーブルから取得されます。元のテーブルに日付の行がない場合は、代わりに再帰の最後の行の値が取得されます。

    古いバージョンの場合、カレンダーテーブルと左側の結合ON句のサブクエリを使用して、最後の既存の値を取得できます。

    select b.col, c.date_id, b.value
    from time_table c
    left join balance b on b.dt_id = (
      select max(dt_id)
      from balance b1
      where b1.dt_id <= c.date_id
    )
    where c.date_id >= (select min(dt_id) from balance)
      and c.date_id <= (select max(dt_id) from balance)
    

    db-fiddle

    更新

    質問が変わったので:

    select b.col, c.date_id, b.value
    from (
      select col, min(dt_id) as min_dt, max(dt_id) as max_dt
      from balance
      group by col
    ) i
    join time_table c
      on  c.date_id >= i.min_dt
      and c.date_id <= i.max_dt
    left join balance b
      on  b.col = i.col
      and b.dt_id = (
        select max(dt_id)
        from balance b1
        where b1.dt_id <= c.date_id
          and b1.col = i.col
    )
    order by b.col, c.date_id
    

    db-fiddle

    (col, dt_id)にインデックスがあることを確認してください 。最良の場合、それが主キーになります。 date_id time_table内 インデックスまたは主キーも必要です。




    1. Pythonを使用したMySqlテーブルの列の順序付け

    2. タイムスタンプNOTNULLDEFAULT CURRENT_TIMESTAMPは、あるマシンではnullにできますが、別のマシンではnullにできませんか?

    3. PostgreSQLインストールのバイナリ形式でpg_repack拡張機能をコンパイルする

    4. OracleCLOBのパフォーマンス