Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Попълване на липсващи дати по групи

Можете да използвате data.table от R . Ако приемем, че колоната „час“ е от клас „Дата“,

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разгръщане на LocalDB на клиентски компютър

  2. Използвайте OBJECT_NAME(), за да получите името на обект от неговия object_id в SQL Server

  3. Завъртане с помощта на SQL Server 2000

  4. Разделете стойностите на няколко реда

  5. Разрешението EXECUTE беше отказано на обекта 'xxxxxxx', база данни 'zzzzzzz', схема 'dbo'