【问题标题】:Teradata SQL: Compare values inside groupTeradata SQL:比较组内的值
【发布时间】:2015-07-27 18:49:28
【问题描述】:

我最近遇到了一个问题,似乎无法使用 SQL(或其他方式)找到一个好的解决方案。我有一张像下面这样的表格

uid | event | start_date | end_date
 1      A     23/07/2014    NULL
 1      B     25/07/2014    NULL
 1      C     26/08/2014    NULL
 1      A        NULL      25/07/2014
 2      A     23/07/2014    NULL
 2      C     19/09/2014    NULL
 2      B     13/10/2014    NULL
 2      A        NULL      25/10/2014
 2      B     12/09/2014    NULL

对于每个用户(由唯一的用户 ID uid 给出),如果相同的事件被触发的 start_date 小于或等于,我希望有另一列的值为 1end_date。对于上面的示例,我们会将结果表作为

uid | event | start_date | end_date   | triggered
 1      A     23/07/2014    NULL            1
 1      B     25/07/2014    NULL            0
 1      C     26/08/2014    NULL            0
 1      A        NULL      25/07/2014       1
 2      A     28/11/2014    NULL            0
 2      C     19/09/2014    NULL            0    
 2      B     13/10/2014    NULL            1
 2      A        NULL      25/10/2014       0 
 2      B        NULL      15/11/2014       1

因为对于用户1,事件A 具有start_date <= end_date,因此该事件对应的triggered 值将是1。用户2 也是如此,其中事件B 由给定条件触发。我想出了一个需要自我加入表格的解决方案,但我希望以更好的方式做到这一点并同时学习一些新技术。任何帮助或提示将不胜感激。

【问题讨论】:

  • 1) 什么是 order_date ? 2)条件不明确。用户 1 有 4 行。其中 2 个有 A 所以你的查询是 row1's startDate
  • @eranotzap 对这个错误感到抱歉。我现在已经改变了。是的,我的条件是对于相同的uidevent,如果start_Date <= end_date 则两者都应该对应的triggered 值应该显示1
  • 为什么你有 2 条记录?为什么不更新第一个 A 的结束时间并为其分配一个触发标志?

标签: sql teradata


【解决方案1】:

我认为你可以用窗口函数做你想做的事。如果我理解逻辑:

select t.*,
       (case when min(start_date) over (partition by uid, event) <
                  max(end_date) over (partition by uid, event)
             then 1 else 0
        end) as triggered
from table t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2022-12-02
    • 2011-05-11
    • 2021-07-02
    • 2012-11-24
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多