下面是我的表的一個子集(對于第一個 id)
| 日期 | ID | 價值 |
|---|---|---|
| 2022 年 1 月 1 日 | 1 | 5 |
| 2022 年 8 月 1 日 | 1 | 2 |
對于每個 id,日期不是連續的(例如,對于 id 1,最小日期是 01/01/2022,最大日期是 08/01/2022)——兩個日期之間有 7 天。我想插入行以使每個 id 的日期連續且連續 - 值欄位/列的值用 0 填充,以便更新后的表如下所示:
| 日期 | ID | 價值 |
|---|---|---|
| 2022 年 1 月 1 日 | 1 | 5 |
| 2022 年 2 月 1 日 | 1 | 0 |
| 2022 年 3 月 1 日 | 1 | 0 |
| 2022 年 4 月 1 日 | 1 | 0 |
| 2022 年 5 月 1 日 | 1 | 0 |
| 2022 年 6 月 1 日 | 1 | 0 |
| 2022 年 7 月 1 日 | 1 | 0 |
| 2022 年 8 月 1 日 | 1 | 2 |
任何有關如何實作此功能的 SQL 代碼都將受到高度贊賞。我有一個日歷表,但不確定如何將它與上表連接,以便我用 0 為每個 id 動態填寫缺失的日期。
我的日歷表如下所示:
| 日期 |
|---|
| 2022 年 1 月 1 日 |
| 2022 年 2 月 1 日 |
| 2022 年 3 月 1 日 |
| 2022 年 4 月 1 日 |
uj5u.com熱心網友回復:
考慮到您宣告您有一個日歷表,您似乎需要使用另一個表中的和日期JOIN來處理它,然后回傳到您的表:MINMAXLEFT JOIN
WITH MinMax AS(
SELECT ID,
MIN(date) AS MinDate,
MAX(date) AS MaxDate
FROM dbo.YourTable
GROUP BY ID),
Dates AS(
SELECT MM.ID,
C.CalendarDate AS [Date]
FROM MinMax MM
JOIN dbo.CalendarTable C ON MM.MinDate <= C.CalendarDate
AND MM.MaxDate >= C.CalendarDate)
SELECT D.ID,
D.[Date],
ISNULL(YT.[Value],0) AS [Value]
FROM Dates D
LEFT JOIN dbo.YourTable YT ON D.ID = YT.ID
AND D.[Date] = YT.[Date];
uj5u.com熱心網友回復:
SET DATEFORMAT DMY
-- CREATE A TABLE WITH OUR INPUT DATA
DROP TABLE IF EXISTS #TheData
GO
CREATE TABLE #TheData
(TheDate DATE, id INT, TheValue INT)
INSERT INTO #TheData
(TheDate,id,Thevalue)
VALUES
('01/01/2022',1,5),
('08/01/2022',1,2),
('17/01/2022',2,7),
('25/01/2022',2,7),
('15/02/2022',2,7)
-- CREATE A CALENDAR CTE
DECLARE @StartDate date = '20210101';
DECLARE @CutoffDate date = DATEADD(DAY, -1, DATEADD(YEAR, 2, @StartDate));
;WITH DateSeq(TheDate) AS
(
SELECT @StartDate
UNION ALL
SELECT DATEADD(dd,1,TheDate) FROM DateSeq
WHERE TheDate < @CutoffDate
)
-- CROSS JOIN OUR CALENDAR CTE TO OUR SOURCE DATA. DERIVED TABLE TO GET FIRST AND LAST OF EACH RANGE TO USE FOR JOIN
SELECT
ds.*
,SourceDataRangesByID.ID
,ISNULL(td.TheValue,0) AS TheValue
FROM
DateSeq ds
CROSS JOIN
(
SELECT
d.ID
,MIN(d.TheDate) AS MinDatePerID
,MAX(d.TheDate) AS MaxDatePerID
FROM #TheData d
GROUP BY d.ID
) SourceDataRangesByID
LEFT JOIN #TheData td ON td.id = SourceDataRangesByID.ID AND td.TheDate = ds.TheDate
WHERE ds.TheDate >= SourceDataRangesByID.MinDatePerID
AND ds.TheDate <= SourceDataRangesByID.MaxDatePerID
OPTION (MAXRECURSION 0);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517356.html
標籤:sqlsql服务器
