每组保持顺序的最小值和最大值
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() 函数将创建的列替换为前一行的更新列。以上是关于每组保持顺序的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章