下面是我的表格,其中包含ID,日期列
ID Date
1 2017-06-11
2 2017-06-11
3 2017-06-04
1 2017-06-04
4 2017-06-04
5 2017-06-04
6 2017-05-28
5 2017-06-04
2017-06-11是本周开始日期,2017-06-04是上周开始日期。
我想创建一个标志,其中Id在前一周存在,而不是在本周作为1.
例如,ID 4出现在前一周而不是本周。类似地,ID 6出现在2017-05-28而不是2017-06-04。 当我在本周查询/分析我的数据时,我的数据应该看起来像
ID Date flag
1 2017-06-11 0
2 2017-06-11 0
3 2017-06-04 0
1 2017-06-04 0
4 2017-06-04 1
5 2017-06-04 0
同样,当我分析前一周的数据时,
ID Date flag
3 2017-06-04 0
1 2017-06-04 0
4 2017-06-04 0
5 2017-06-04 0
6 2017-05-28 1
5 2017-06-04 0
我尝试使用Left join检查当前日期的ID,而不是之前的日期,但是我得到的数据不准确,因为这必须是动态的。 当我每周查询时,我必须仅比较本周和上周,当我查询上周时,我必须上周才能获得2017-05-28数据。
然后我在画面中给出过滤器以选择日期并显示结果。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
由于您希望查询结果取决于您要查看的周,我建议编写一个查询,将感兴趣的一周的开始和相应的前一周的开始作为参数。 如果我理解你正确,那么你想要一个像......这样的查询:从当前和前一周获取所有记录;对于前一周的那些记录,当前周没有相应的条目,写入标志= 1;否则写标志= 0“。然后,以下查询将其直接“转换”为SQL,应该完成这项工作:
select
t1.*,
(case when t1.date = '2017-06-04'
and not exists
(select * from table t2 where t2.id = t1.id and t2.date = '2017-06-11')
then 1
else 0
end) as flag
from table t1
where t1.date = '2017-06-04' or t1.date = '2017-06-11'
答案 1 :(得分:0)
计算您想要的一周的开始日期并返回两周的值
DECLARE @date DATETIME = GETDATE()
DECLARE @firstDayWeek DATE =(SELECT convert(DATE,(DATEADD(dd,-DATEPART(WEEKDAY, @date)+1,@date))))
SELECT *
,CASE WHEN f.lastDate < @firstDayWeek THEN 1 ELSE 0 END flag
FROM tablee t1
OUTER APPLY( SELECT MAX(t2.date) lastDate
from tablee t2
WHERE t2.ID=t1.ID
AND t2.date < DATEADD(dd,7,@firstDayWeek )
) f
WHERE BETWEEN DATEADD(dd,-8,@firstDayWeek ) AND DATEADD(dd,6,@firstDayWeek )