我有一个非常简单的查询,如下所示:
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 failure
是2018-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
答案 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;