【问题标题】:how to check if value exists in previous date and not in current date如何检查值是否存在于前一个日期而不是当前日期
【发布时间】:2017-11-17 21:28:44
【问题描述】:

下面是我的表格,有 id's、dates 列

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

我尝试使用左连接来检查 ID 在当前日期而不是在上一个日期,但是我得到的数据不准确,因为这必须是动态的。 当我每周查询时,我必须只比较本周和上一周,当我查询上周时,我必须只获取上周和 2017-05-28 的数据。

然后我在tableau中给过滤器选择日期并显示结果。

谁能帮我解决这个问题?

【问题讨论】:

  • 您使用的是哪个数据库? (MSSQL、Oracle、Mysql、...)

标签: sql tableau-api


【解决方案1】:

计算您想要的一周的开始日期并返回两周的值

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 )

【讨论】:

  • 谢谢你..这就是我想要的。但是,我必须检查如何在 tableau 中调用它。
  • 然而,我假设外部应用和左连接是相同的,我只在使用函数时才使用外部应用。你能告诉我外部申请是如何在这里工作而不是离开加入吗?(这只是为了我的理解)。谢谢
  • "Join" 用于链接两个独立的表。使用“APPLY”,它提供与根据前一个表创建的表的链接。 exp: f 表是使用表 t1 创建的。(t2.ID=t1.ID )
【解决方案2】:

由于您希望根据要查看的一周获得查询结果,我建议编写一个查询,将感兴趣的一周的开始和相应的前一周的开始作为参数。 如果我理解你的话,那么你想要一个类似的查询......“获取当前和上一周的所有记录;对于上一周的记录,当周没有对应的条目时,写 flag=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'

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2023-03-19
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多