Redshift sql根据某个记录之前的时间戳识别记录

Posted

技术标签:

【中文标题】Redshift sql根据某个记录之前的时间戳识别记录【英文标题】:Redshift sql identify records based on timestamp which came before a certain record 【发布时间】:2021-07-19 00:24:44 【问题描述】:

我有一个具有以下结构的红移表

titleId | country | updateTime | value 
ID1 | US | 2020-01-01 00:00:00.000 | someValueA
ID1 | US | 2020-01-01 00:00:01.000 | someValueB
ID1 | IN | 2020-01-04 00:00:05.000 | someValue
ID2 ....
ID3....
ID1 | US | 2021-02-02 00:00:00.000 | someValue5
ID1 | GB | 2021-02-02 00:00:00.000 | someValue5

我试图找到 3 个集合,所有 titleIds [最好是整行,而不仅仅是 titleIds 的列表],它们的国家/地区在美国之后, 反之,在 IN 之后有 US 以及所有只有 IN 条目而没有其他内容的标题。

现在我们有可能对于一个 titleId 有以下顺序 IN、US、IN、US,在这种情况下,我们在 IN 之后有 2 个 US 实例。

我最初想在同一张表上进行内部联接,这可以帮助我找到同时具有美国和印度领土的记录。但是后来我无法弄清楚如何使用这些结果来根据之前的内容进行过滤。是否可以通过 Redshift SQL?是否需要我在进行某种过滤后编写一些自定义代码?

【问题讨论】:

编辑您的问题并显示您想要的结果。 表格是无序的。每当出现查询时,您必须关心单个表中行的顺序,这里就是这种情况,您需要使用窗口函数。窗口函数基本上对单个表中的行进行临时排序。 【参考方案1】:

您可以使用以下方法选择满足条件的每一行:

select t.*
from (select t.*,
             sum( (country = 'US')::int) over (partition by titleid order by updatetime rows between current row and unbounded following) as num_us_following,
             sum( (country = 'IN')::int) over (partition by titleid order by updatetime rows between current row and unbounded following) as num_in_following,
             sum( country <> 'IN')::int) over (partition by titleid) as non_nonind
      from t
     ) t;

那么你的三个条件是:

where country = 'IN' and num_us_following &gt; 0 where country = 'US' and num_in_following &gt; 0 where country = 'IN' and non_nonin = 0

【讨论】:

以上是关于Redshift sql根据某个记录之前的时间戳识别记录的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift SQL 中查找指定日期之前的 Max(Date)

胶水创建重复记录,如何解决?

如何根据之前的记录将 SQL 表连接到自身?

使用 COPY 命令将数据从 JSON 文件复制到 Redshift

SQL 获取超过某个日期的记录,高于某个值,最小数量

获取用户会话列表 SQL Redshift