Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzupełnianie brakujących dat według grup

Możesz użyć data.table z R . Zakładając, że kolumna „czas” należy do klasy „Data”,

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

W wersji deweloperskiej można to również zrobić bez ustawiania „klucza”. Instrukcje instalacji wersji deweloperskiej znajdują się 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

Lub jak sugerował @Arun, bardziej wydajną opcją byłaby

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAX vs Top 1 - co jest lepsze?

  2. Rozróżnianie wielkości liter w Postgres

  3. T-SQL:Zaokrąglaj do najbliższego 15-minutowego interwału

  4. Jak dodać kolumnę tożsamości do tabeli za pomocą TSQL i GUI w SQL Server - SQL Server / T-SQL Tutorial, część 40

  5. Zwróć listę profili poczty bazy danych w SQL Server (T-SQL)