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