[英]T-SQL filtering records based on dates and time difference with other records
我有一個表,我必須執行一個相當復雜的過濾器:首先應用按日期過濾,但是如果它們的時間差與其上一個或下一個相比不超過 8 小時,則應該包括前幾天和后幾天的記錄記錄(取決於日期是小於還是大於過濾日期)。
對於那些相鄰的日子,選擇應該在第一個不滿足此條件的記錄處停止。
這就是我的原始數據的樣子:
ID | 描述 | 入境日期 |
---|---|---|
1 | 事件類型 1 | 2021-03-12 21:55:00.000 |
2 | 事件類型 1 | 2021-03-12 01:10:00.000 |
3 | 事件類型 1 | 2021-03-11 20:17:00.000 |
4 | 事件類型 1 | 2021-03-11 05:04:00.000 |
5 | 事件類型 1 | 2021-03-10 23:58:00.000 |
6 | 事件類型 1 | 2021-03-10 11:01:00.000 |
7 | 事件類型 1 | 2021-03-10 10:00:00.000 |
在這個示例集中,如果我的過濾日期是“2021-03-11”,我的預期結果集應該是當天的所有記錄加上滿足 8 小時條件的 03-12 和 03-10 的相鄰記錄。 請注意如何不包含 ID 為 7 的記錄,因為 ID 為 6 的記錄不符合:
ID | 入境日期 |
---|---|
2 | 2021-03-12 01:10:00.000 |
3 | 2021-03-11 20:17:00.000 |
4 | 2021-03-11 05:04:00.000 |
5 | 2021-03-10 23:58:00.000 |
需要建議如何編寫這個復雜的查詢
這是間隙和島嶼的變體。 定義差異。 . . 然后根據差異進行分組:
with e as (
select t.*
from (select t.*,
sum(case when prev_entrydate > dateadd(hour, -8, entrydate) then 0 else 1 end) over (order by entrydate) as grp
from (select t.*,
lag(entrydate) over (order by entrydate) as prev_entrydate
from t
) t
)
select e.*
from e.*
where e.grp in (select e2.grp
from t e2
where date(e2.entrydate) = @filterdate
);
注意:我不確定過濾日期是如何應用的。 這假設它是一整天的任何事件,這意味着可能有多個組。 如果只有一個組(比如當天的第一組),從性能的角度來看,可以稍微簡化查詢。
declare @DateTime datetime = '2021-03-11'
select *
from t
where t.EntryDate between DATEADD(hour , -8 , @DateTime) and DATEADD(hour , 32 , @DateTime)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.