我正在努力合併一個過濾器的連續日期。結合連續日期
例子:
我的數據集:
結果我需要:(只爲paid = 3
)
的腳本模式和數據
CREATE TABLE [dbo].[NRFC](
[work_status] [int] NOT NULL,
[paid] [varchar](2) NOT NULL,
[from_date] [date] NOT NULL,
[to_date] [date] NOT NULL)
INSERT INTO [dbo].[NRFC]([work_status], [paid], [from_date], [to_date])
SELECT 101, N'3', '20100101 00:00:00.000', '20100116 00:00:00.000' UNION ALL
SELECT 101, N'3', '20100116 00:00:00.000', '20150128 00:00:00.000' UNION ALL
SELECT 101, N'5', '20150129 00:00:00.000', '20150331 00:00:00.000' UNION ALL
SELECT 101, N'4', '20150401 00:00:00.000', '20150512 00:00:00.000' UNION ALL
SELECT 101, N'3', '20160101 00:00:00.000', '20170315 00:00:00.000' UNION ALL
SELECT 101, N'4', '20170316 00:00:00.000', '20170317 00:00:00.000' UNION ALL
SELECT 101, N'3', '20090101 00:00:00.000', '20090110 00:00:00.000' UNION ALL
SELECT 101, N'3', '20090111 00:00:00.000', '20090115 00:00:00.000' UNION ALL
SELECT 101, N'3', '20090115 00:00:00.000', '20090331 00:00:00.000' UNION ALL
SELECT 101, N'3', '20090401 00:00:00.000', '20091212 00:00:00.000'
到目前爲止我的代碼:
;WITH Grouped (
from_date
,to_date
,paid
,first
)
AS (
SELECT from_date
,to_date
,paid
,isnull((
SELECT CASE
WHEN paid <> w.paid
THEN 1
ELSE 0
END
FROM NRFC
WHERE from_date = (
SELECT max(from_date)
FROM NRFC
WHERE from_date < w.from_date
)
), 1) AS first
FROM NRFC w
WHERE paid = 3
)
SELECT min(from_date) AS from_date
,max(to_date) AS to_date
,paid
FROM (
SELECT from_date
,to_date
,paid
,isnull((
SELECT sum(first)
FROM grouped
WHERE from_date > g.from_date
), 0) AS part
FROM grouped g
) p
GROUP BY p.part
,p.paid
ORDER BY from_date
'SELECT *,CASE WHEN DATEDIFF(DAY,to_date,LEAD(from_date)OVER(ORDER BY to_date))> = 1 THEN 0 ELSE 1 END newROW FROM @ NRFC'這會讓您知道應該有一個新的邏輯行 – SQLMason
感謝SQLMason,我在SQL 2008 – Sreedhar
對不起,我沒有注意到這一點。 – SQLMason