簡體   English   中英

T-SQL 根據與其他記錄的日期和時間差過濾記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM