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

グループごとに不足している日付を埋める

    data.tableを使用できます Rから 。 'time'列が'Date'クラスであると仮定すると、

    library(data.table)#v1.9.5+
    DT1 <- setDT(df1)[, list(time=seq(min(time), max(time), by ='day')),
                        by =.(shop_id, item_id)]
    setkeyv(df1, names(df1)[1:3])[DT1][is.na(value), value:=0]
    #   shop_id item_id       time value
    #1:     150       1 2015-07-10     3
    #2:     150       1 2015-07-11     5
    #3:     150       1 2015-07-12     0
    #4:     150       1 2015-07-13     2
    #5:     150       2 2015-07-10    15
    #6:     150       2 2015-07-11     0
    #7:     150       2 2015-07-12    12
    

    開発バージョンでは、「キー」を設定せずにこれを行うこともできます。開発バージョンをインストールする手順は、hereです。

     df1[DT1, on =c('shop_id', 'item_id', 'time')][is.na(value), value:=0]
     #   shop_id item_id       time value
     #1:     150       1 2015-07-10     3
     #2:     150       1 2015-07-11     5
     #3:     150       1 2015-07-12     0
     #4:     150       1 2015-07-13     2
     #5:     150       2 2015-07-10    15
     #6:     150       2 2015-07-11     0
     #7:     150       2 2015-07-12    12
    

    または、@ Arunが提案したように、より効率的なオプションは

     DT1[, value := 0L][df1, value := i.value, on = c('shop_id', 'item_id', 'time')]
     DT1 
    


    1. ATTIMEZONEを使用して古いレポートを修正する

    2. PHP7.0上のLaravel5.4:PDO例外-ドライバーが見つかりませんでした(MySQL)

    3. PostgreSQL:警告:コンソールコードページ(437)はWindowsコードページ(1252)とは異なります

    4. ステートメントにUNION、INTERSECT、またはEXCEPT演算子が含まれている場合は、ORDER BY項目を選択リストに表示する必要があります(SQL Server)