Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Điền các ngày còn thiếu theo nhóm

Bạn có thể sử dụng data.table từ R . Giả sử rằng cột 'thời gian' thuộc lớp 'Ngày tháng',

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

Trong phiên bản devel, bạn cũng có thể thực hiện việc này mà không cần đặt 'key'. Hướng dẫn cài đặt phiên bản devel tại 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

Hoặc như @Arun đã đề xuất, một tùy chọn hiệu quả hơn sẽ là

 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. Tính tổng số đang chạy với mệnh đề OVER và mệnh đề PARTITION BY trong SQL Server

  2. Giao dịch phân tán trên máy chủ được liên kết giữa máy chủ sql và mysql

  3. Làm cách nào để chỉnh sửa bảng để bật CASCADE DELETE?

  4. Cách @@ MAX_CONNECTIONS hoạt động trong SQL Server

  5. Hoàn tất quy trình sao chép bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác (Xuất-nhập) trong SQL Server