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

tìm các mục nhập bị thiếu cho các ngày làm việc và điền vào hàng với các giá trị từ ngày gần nhất

Đối với những loại truy vấn này, bạn sẽ có được những lợi ích đáng kể về hiệu suất từ ​​việc tạo một bảng lịch chứa mọi ngày bạn cần kiểm tra. (Nếu bạn quen thuộc với thuật ngữ "bảng thứ nguyên", thì đây chỉ là một bảng như vậy để liệt kê mọi ngày quan tâm.)

Ngoài ra, toàn bộ truy vấn có thể trở nên đơn giản hơn đáng kể.

SELECT
   cal.calendar_date   AS data_date,
   CASE WHEN prev_data.gap <= next_data.gap
        THEN prev_data.data_value
        ELSE COALESCE(next_data.data_value, prev_data.data_value)
   END
       AS data_value
FROM
    calendar   AS cal
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, data_date, cal.calendar_date)   AS gap
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, cal.calendar_date, data_date)   AS gap
    FROM
        data_table
    WHERE
        data_date >  cal.calendar_date
    ORDER BY
        data_date ASC
)
   next_data
WHERE
   cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
;

CHỈNH SỬA Trả lời bình luận của bạn với một yêu cầu khác

Để luôn nhận được "giá trị ở trên" thì dễ dàng hơn và việc chèn các giá trị đó vào bảng cũng dễ dàng ...

INSERT INTO
    data_table
SELECT
   cal.calendar_date,
   prev_data.data_value
FROM
    calendar   AS cal
CROSS APPLY
(
    SELECT TOP(1)
        data_date,
        data_value
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
WHERE
       cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
   AND cal.calendar_date <> prev_data.data_date
;

Lưu ý: Bạn có thể thêm WHERE prev_data.gap > 0 vào truy vấn lớn hơn ở trên để chỉ nhận những ngày chưa có dữ liệu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách khắc phục “Chuyển đổi không thành công khi chuyển đổi giá trị thành kiểu dữ liệu” trong SQL Server

  2. máy chủ sql sử dụng cột được tính

  3. CHỌN TỪ thủ tục được lưu trữ?

  4. Làm thế nào để buộc bộ thu gom rác dòng hoàn thành công việc của mình với mức độ ưu tiên cao nhất?

  5. Cách chuyển đổi cột dấu thời gian của SQL Server sang định dạng ngày giờ