每组保持顺序的最小值和最大值

Posted

技术标签:

【中文标题】每组保持顺序的最小值和最大值【英文标题】:Min and max value per group keeping order 【发布时间】:2020-10-18 16:13:38 【问题描述】:

我在 Redshift 中遇到了一个关于分组的小问题;我有一个如下表:

输入

VALUE       CREATED       UPDATED
------------------------------------
1        '2020-09-10'   '2020-09-11'
1        '2020-09-11'   '2020-09-13'
2        '2020-09-15'   '2020-09-16'
1        '2020-09-17'   '2020-09-18'

我想得到这个输出:

VALUE       CREATED       UPDATED
------------------------------------
1        '2020-09-10'   '2020-09-13'
2        '2020-09-15'   '2020-09-16'
1        '2020-09-17'   '2020-09-18'

如果我按值进行简单的最小和最大日期分组,它不起作用。

【问题讨论】:

【参考方案1】:

这是一个孤岛问题的例子。如果数据中没有时间间隔,那么行号的差异是一个简单的解决方案:

select value, min(created), max(updated)
from (select t.*,
             row_number() over (order by created) as seqnum,
             row_number() over (partition by value order by created) as seqnum_2
      from t
     ) t
group by value, (seqnum - seqnum_2)
order by min(created);

为什么这行得通有点难以解释。但是如果您查看子查询的结果,您会看到行号之间的差异如何识别具有相同value 的相邻行。

【讨论】:

嗨,Gordon,感谢您的快速回答,它工作得很好,但是您对数据中的每个空白是什么意思? @nasshy 。 . .基本上,这会忽略updated 列,假设它总是匹配下一个created 是的,我有这个问题,但在这个表的顶部,我想用 LAG() 函数将创建的列替换为前一行的更新列。

以上是关于每组保持顺序的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

C. RationalLee 思维题

mysql 查询最大最小值和对应的时间

从变量中获取最小值和最大值的正确方法

Pandas 跨行的最小值和最大值

优化查询以确定一个值在最小值和最大值之间

如何检索时间序列数据的最小值和最大值