我有一張這樣的桌子
kpl_id Process_date baseline_date
----------------------------------------------------
20 2018-04-12 02:00:00 NULL
21 2018-04-13 02:01:00 NULL
22 2018-04-14 02:02:00 NULL
23 2018-04-16 09:15:00 2018-04-17 10:23:00
24 2018-04-16 17:15:00 NULL
25 2018-04-17 02:00:00 NULL
26 2018-04-18 02:00:00 NULL
--------------------------------------------------
我的要求是選擇除baseline_day 及其下一天和前一天以外的所有行。
所以輸出看起來像這樣
kpl_id Process_date baseline_date
----------------------------------------------------
20 2018-04-12 02:00:00 NULL
21 2018-04-13 02:01:00 NULL
26 2018-04-18 02:00:00 NULL
--------------------------------------------------
我嘗試了以下查詢,我認為這是一種錯誤的方法。
select Pl.* from process_log_temp PL left outer join
(select *,dateadd(day,-2,baseline_created) d1,dateadd(day,2,baseline_created) d2 from process_log_temp where baseline_created is not null) PL2 on PL2.kpl_id=PL.kpl_id
where PL.process_date between d1 and d2
當然,它只回傳了我沒想到的基線日
這是所有行的小提琴
環境是SQL Server 2012
uj5u.com熱心網友回復:
首先你找到baseline_date,然后從那里得到上一個和下一個日期。之后,只需從不包括該日期范圍的表格中選擇
WITH baseline AS
(
SELECT [process_date],
[prev_date] = CONVERT(DATE, DATEADD(DAY, -1, [process_date])),
[next_date] = CONVERT(DATE, DATEADD(DAY, 1, [process_date]))
FROM [process_log_temp]
WHERE [baseline_created] IS NOT NULL
)
SELECT *
FROM process_log_temp p
WHERE NOT EXISTS
(
SELECT *
FROM baseline x
WHERE p.[process_date] > x.[prev_date]
AND p.[process_date] < DATEADD(DAY, 1, x.[next_date])
)
EDIT-1:新要求
如果基線在 22 號,如果 21 號沒有資料,則要求也跳過 20 號的資料
聽起來你想基于行而不是日期
WITH process AS
(
SELECT *, rn = row_number() over (order by [process_date])
FROM [process_log_temp]
)
SELECT *
FROM process p
WHERE NOT EXISTS
(
SELECT *
FROM process x
WHERE x.baseline_created IS NOT NULL
AND p.rn >= x.rn - 1
AND p.rn <= x.rn 1
)
EDIT-2 :對于同一天的多次輸入,使用dense_rank()并轉換process_date到訂購日期
rn = dense_rank() over (order by convert(date, [process_date]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329770.html
標籤:sql sql-server 查询语句
上一篇:SQL資料庫If-Else陳述句
下一篇:嘗試使用合并陳述句使觸發器起作用
