如果我有这样的表:
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。
答案 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