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

Làm thế nào để lấp đầy những khoảng trống?

Bạn có 2 vấn đề đang cố gắng giải quyết. Vấn đề đầu tiên là làm thế nào để lấp đầy những khoảng trống. Vấn đề thứ hai là điền trường Đếm cho những bản ghi bị thiếu.

Vấn đề 1:Điều này có thể được giải quyết bằng cách sử dụng Dates Lookup table hoặc bằng cách tạo recursive common table expression . Tôi khuyên bạn nên tạo bảng Tra cứu ngày tháng cho việc này nếu đó là một tùy chọn. Nếu bạn không thể tạo một bảng như vậy, thì bạn sẽ cần một cái gì đó như thế này.

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

Điều đó sẽ tạo cho bạn một danh sách các ngày bắt đầu bằng MIN ngày trong bảng của bạn và kết thúc bằng MAX .

Vấn đề 2:Đây là nơi chứa correlated subquery sẽ hữu ích (nhiều như tôi thường tránh xa chúng) để lấy cnt cuối cùng từ bảng ban đầu của bạn:

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r


  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 lưu các tài liệu như PDF, Docx, xls trong SQL Server 2008

  2. SqlGeography Type Mismatch

  3. Cách tạo bí danh kiểu dữ liệu do người dùng xác định trong SQL Server bằng T-SQL

  4. Cách sử dụng toán tử GIỮA trong SQL Server

  5. Cập nhật dữ liệu thông qua một hàm có giá trị bảng trong SQL Server