在给定条件下评估连续日期

时间:2018-09-06 19:01:16

标签: sql amazon-redshift

我有一个非常简单的查询,如下所示:

SELECT
event_date,
client_id,
error_id
FROM
table.name

这不是 actual 查询,但是为了简单起见并具有可重复性,它为我们提供了所需的东西。产生这样的输出:

event_date   client_id   error_id
2018-09-01   12345       232 send failure
2018-09-02   12345       232 send failure
2018-09-03   12345       232 send failure
2018-09-05   12345       232 send failure
2018-09-01   12345       508 server failure
2018-09-02   12345       615 script break
2018-09-01   67890       232 send failure
2018-09-02   67890       232 send failure
2018-09-03   67890       404 load failure
2018-09-01   67890       508 server failure
2018-09-02   67890       615 script break

我想要做的是创建另一列,如果客户ID连续几天看到此错误,该列将“标记”。假设客户ID#12345第一次看到232 send failure2018-09-01。在2018-09-02(或出现此错误的任何后续连续日期),将对其进行标记。因此,2018-09-05上的该错误,尽管对于相同的客户ID来说是相同的错误,但不会被标记,因为2018-09-04上没有。所以我的理想输出如下:

event_date   client_id   error_id            flag
2018-09-01   12345       232 send failure    No
2018-09-02   12345       232 send failure    Yes
2018-09-03   12345       232 send failure    Yes
2018-09-05   12345       232 send failure    No
2018-09-01   12345       508 server failure  No
2018-09-02   12345       615 script break    No
2018-09-01   67890       232 send failure    No
2018-09-02   67890       232 send failure    Yes
2018-09-03   67890       404 load failure.   No
2018-09-01   67890       508 server failure  No
2018-09-02   67890       615 script break    Yes

2 个答案:

答案 0 :(得分:1)

为此,您必须将此表/结果集自连接到其自己的日期+ 1天,并进行左连接(所有其他匹配的列)。

然后您可以使用case语句根据联接是否匹配任何内容(在此检查任何列就足够了)来得出yes / no标志。

SELECT event_date, client_id, error_id,
       case when b.event_date is not null then 'Yes' else 'No' end as flag
FROM table.name a
left join table.name b
on dateadd(day,1,a.event_date) = b.event_date and
   a.client_id = b.client_id and
   a.error_id = b.error_id

左联接将包含表中的所有内容,并为您提供任意日期+ 1的列(如果没有,则为null)。

我不是红班用户,但基于以下原因,看来上面的日期添加功能应该不错:https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html

答案 1 :(得分:0)

我只会使用lag()case

select t.*,
       (case when lag(error_id) over (partition by client_id order by date) = error_id and
                  lag(date) over (partition by client_id order by date) = dateadd(day, -1, date)
             then 'yes' else 'no'
        end) as flag_consecutive_dates
from t;