如何检查上一个日期是否存在值,而不是当前日期

时间:2017-06-15 11:41:49

标签: sql tableau

下面是我的表格,其中包含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数据。

然后我在画面中给出过滤器以选择日期并显示结果。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 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 )