gpt4 book ai didi

sql - PostgreSQL 非标准选择(分组)

转载 作者:行者123 更新时间:2023-11-29 12:05:55 28 4
gpt4 key购买 nike

我有一些记录:

+---+--------+---------------------------+|   | Data   |            Time           |+---+--------+---------------------------+| 1 | 1      | 2013-04-22 16:18:07       || 2 | 1      | 2013-04-22 16:18:17       || 3 | 2      | 2013-04-22 16:18:27       || 4 | 2      | 2013-04-22 16:18:37       || 5 | 1      | 2013-04-22 16:18:47       || 6 | 1      | 2013-04-22 16:18:57       || 7 | 1      | 2013-04-22 16:19:07       || 8 | 3      | 2013-04-22 16:19:17       || 9 | 3      | 2013-04-22 16:19:27       || 10| 1      | 2013-04-22 16:19:37       || 11| 2      | 2013-04-22 16:19:47       || 12| 2      | 2013-04-22 16:19:57       || 13| 3      | 2013-04-22 16:20:07       || 14| 3      | 2013-04-22 16:20:17       |+---+--------+---------------------------+

我怎样才能得到这些记录?:

+---+--------+---------------------------+|   | Data   |            Time           |+---+--------+---------------------------+| 1 | 1      | 2013-04-22 16:18:07       || 3 | 2      | 2013-04-22 16:18:27       || 5 | 1      | 2013-04-22 16:18:47       || 8 | 3      | 2013-04-22 16:19:17       || 10| 1      | 2013-04-22 16:19:37       || 11| 2      | 2013-04-22 16:19:47       || 13| 3      | 2013-04-22 16:20:07       |+---+--------+---------------------------+

我想为每个子组选择第一个条目,但如果我使用不同的 - 我有这个记录数组:

+---+--------+---------------------------+|   | Data   |            Time           |+---+--------+---------------------------+| 1 | 1      | 2013-04-22 16:18:07       || 3 | 2      | 2013-04-22 16:18:27       || 8 | 3      | 2013-04-22 16:19:17       |+---+--------+---------------------------+

最佳答案

这里的问题是您需要定义您正在查看的组。 “数据”值针对不同的组重复。

这是找到每个组的方法。为每一行分配一个顺序值,按时间排序。然后,为每个数据值分配另一个顺序值,按时间排序。当值是连续的时,这些值之间的差异是恒定的。

以下内容在您的数据上使用了这个想法。确定组后,此方法使用 group by 获取数据:

select MIN(data) as data, MIN(time) as time
from (select t.*,
(ROW_NUMBER() over (order by time) -
ROW_NUMBER() over (partition by data order by time
) as thegroup
from t
) t
group by thegroup

如果您想保留更多列,则可以枚举每组中的行以获取第一列:

select data, time
from (select t.*, ROW_NUMBER() over (partition by thegroup order by time) as seqnum
from (select t.*,
(ROW_NUMBER() over (order by time) -
ROW_NUMBER() over (partition by data order by time
) as thegroup
from t
) t
group by thegroup
) t
where seqnum = 1

您也可以使用 Postgres 的 distinct on 语法来做到这一点。

关于sql - PostgreSQL 非标准选择(分组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16152029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com