查询每个ID的单一最老记录

问题描述 投票:0回答:1

假设我有一个数据库,其中有foo、bar、createdate和data列。

我需要的是一个查询,查询foo和bar的每一个独特组合的第一条被创建的记录(即createdate是最低的)。

例如,对于下面的行。

+-----+-----+--------------+----------------+
| foo | bar | creationdate | data           |
+-----+-----+--------------+----------------+
| abc | def | 31.12.2019   | some data      |
+-----+-----+--------------+----------------+
| abc | def | 01.05.2020   | other data     |
+-----+-----+--------------+----------------+
| ghi | jkl | 04.05.2020   | more data      |
+-----+-----+--------------+----------------+
| ghi | jkl | 05.05.2020   | even more data |
+-----+-----+--------------+----------------+

那么我们需要的输出是:

+-----+-----+--------------+----------------+
| abc | def | 31.12.2019   | some data      |
+-----+-----+--------------+----------------+
| ghi | jkl | 04.05.2020   | more data      |
+-----+-----+--------------+----------------+

什么样的SQL查询能给我想要的结果?我使用的是Postgres。

sql postgresql
1个回答
2
投票

试试下面的方法,你可以通过使用窗口函数来实现。row_number(). 您可能需要更改您的 creationDate 这里是 演示.

select
    foo,
    bar,
    creationDate
from
(
    select
        foo,
        bar,
        creationDate,
        row_number() over (partition by foo, bar order by creationDate) as rnk
    from yourTable
) val
where rnk = 1

3
投票

这通常是使用专有的 distinct on () 在Postgres

select distinct on (foo,bar) foo, bar, creationdate, data
from the_table
order by foo,bar,creationdate;
© www.soinside.com 2019 - 2024. All rights reserved.