如何标记过去X天内发生过的ID? SQL Server

时间:2018-05-23 20:26:06

标签: sql-server

如果我有这样的表:

 ID  |  Date  
 1   |  2018-01-01  
 1   |  2018-01-10  
 1   |  2018-02-02  

如何通过CASE'ing获得“过去10天”的标记来获得以下内容:

 ID  |  Date        | Marker  
 1   |  2018-01-01  | 0  
 1   |  2018-01-10  | 1  
 1   |  2018-02-02  | 0

我需要一个解决方案来检查行ID,查看其日期,查看该ID的所有先前日期,并标记当前ID是否已 在“过去x天”范围内。

我在DAX中使用EARLIER()进行了此操作,但无论我在SQL Server中尝试(无论是LAG,WHERE,OVER()等)都似乎不起作用。我希望我能告诉SQL:“早期日期+ x> =日期”。

请帮助我理解SQL的怪癖。

P.S。寻找没有附加连接的解决方案 - 我的桌子足够大。

2018年5月24日编辑:

我不想仅仅比较GetDate()的最后X天,因为我对Last X Days的意思是行中的特定ID,以检查过去x天的日期具有相同的ID。

4 个答案:

答案 0 :(得分:2)

使用LAG查看日期是否与上一个日期相差10天。如果您想要“范围”

,请更改为< =
select
   id
   ,date
   ,Marker = case when dateadd(day,-10,[Date]) = lag([Date]) over (partition by id order by [Date]) then 1 else 0 end 
from YourTable
order by id, [Date]

答案 1 :(得分:2)

试试这个:

Select *,
Case When DateDiff(d,LAG([Date]) OVER(Partition by ID order by [Date]),[Date]) <10 THEN 1
ELSE 0 END AS Marker
from myTable

答案 2 :(得分:1)

您可以使用EXISTS检查过去10天内是否存在具有相同ID的记录。

declare @SampleData table (ID bigint, [Date] date);
insert @SampleData values (1, '20180101'), (1, '20180110'), (1, '20180202');

select
    This.ID,
    This.[Date],
    Marker = convert(bit, case when exists 
    (
        select 1 
        from @SampleData Previous 
        where
            Previous.ID = This.ID and
            Previous.[Date] >= dateadd(day, -10, This.[Date]) and 
            Previous.[Date] < This.[Date]
    ) then 1 else 0 end)
from
    @SampleData This;

我知道你说你不想要任何连接,EXISTS技术上是一个连接 - 称为半连接 - 但是这个查询的执行计划非常简单。我很想知道它对你的桌子表现如何,而不是基于LAG()的解决方案,比如scsimon的答案。

答案 3 :(得分:0)

你在寻找这样的东西:

select Id, Date, IIF(DATEADD(day, -7, GETDATE()) < date, 1, 0) as marker from table_name