我環顧了 StackOverflow,但沒有人提供我需要的解決方案。
我有一個日期表
TheDate ItalyWorkingDay
2039-12-28 1
2039-12-27 1
2039-12-26 0
2039-12-25 0
2039-12-24 0
2039-12-23 1
2039-12-22 1
2039-12-21 1
我必須計算每天的前一個作業日期:
TheDate ItalyWorkingDay PrevItWorkDay
2039-12-28 1 2039-12-27
2039-12-27 1 2039-12-23
2039-12-26 0 2039-12-23
2039-12-25 0 2039-12-23
2039-12-24 0 2039-12-23
2039-12-23 1 2039-12-22
2039-12-22 1 2039-12-21
2039-12-21 1 2039-12-20
我花了整個作業日試圖在 dax 和 SQL 中弄清楚它,但我做不到。
dax 或 T-Sql 中的解決方案會很棒!
uj5u.com熱心網友回復:
一種方法是用來APPLY獲取上一行:
SELECT *
INTO dbo.YourTable
FROM (VALUES(CONVERT(date,'2039-12-28'),1),
(CONVERT(date,'2039-12-27'),1),
(CONVERT(date,'2039-12-26'),0),
(CONVERT(date,'2039-12-25'),0),
(CONVERT(date,'2039-12-24'),0),
(CONVERT(date,'2039-12-23'),1),
(CONVERT(date,'2039-12-22'),1),
(CONVERT(date,'2039-12-21'),1))V(TheDate,ItalyWorkingDay);
GO
SELECT YT.TheDate,
YT.ItalyWorkingDay,
PD.TheDate AS PrevItWorkDay
FROM dbo.YourTable YT
OUTER APPLY (SELECT TOP (1) oa.TheDate
FROM dbo.YourTable oa
WHERE oa.TheDate < YT.TheDate
AND oa.ItalyWorkingDay = 1
ORDER BY oa.TheDate DESC) PD
ORDER BY YT.TheDate DESC;
在 SQL Server 2022 上,您可以使用LAG它及其IGNORE NULLS功能:
SELECT YT.TheDate,
YT.ItalyWorkingDay,
LAG(CASE YT.ItalyWorkingDay WHEN 1 THEN YT.TheDate END) IGNORE NULLS OVER (ORDER BY YT.TheDate) AS PrevItWorkDay
FROM dbo.YourTable YT
ORDER BY YT.TheDate DESC;
或者,您可以使用適用于 SQL Server 2012 的 gaps an island 解決方案:
WITH Grps AS(
SELECT YT.TheDate,
YT.ItalyWorkingDay,
SUM(ItalyWorkingDay) OVER (ORDER BY TheDate
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
FROM dbo.YourTable YT),
WorkingDates AS(
SELECT G.TheDate,
G.ItalyWorkingDay,
MAX(CASE G.ItalyWorkingDay WHEN 1 THEN G.TheDate END) OVER (PARTITION BY G.Grp) AS WorkingDate
FROM Grps G)
SELECT WD.TheDate,
WD.ItalyWorkingDay,
LAG(WD.WorkingDate) OVER (ORDER BY WD.TheDate) AS PrevItWorkDay
FROM WorkingDates WD;
請注意這里的所有解決方案都回傳NULL,2039-12-21因為您的資料中不存在日期2039-12-20,因此不知道它是否是作業日。我假設您的實際(日歷)表中有日期。
清理:
DROP TABLE dbo.YourTable;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507043.html
上一篇:SQLServer動態不同值到列
