SQL - 按每条记录的最新日期选择记录
SQL - Selecting records by the newest date for each record
我有一个包含一些列的 table,其中有两个 - number
、joining_date
。
我要select的是最新加入日期和匹配号码。我创建了以下脚本:
SELECT ac.number, ac.joining_date
FROM accounts ac
INNER JOIN (
SELECT number, MAX(joining_date) as maxDate FROM accounts GROUP BY number
) iac ON ac.number = iac.number AND ac.joining_date = iac.maxDate;
看起来不错,但是,我注意到当 joining_date
相等时,即 2020-04-02 10:17:00.000000
对于多个记录, number
在结果中出现两次,即使MAX
应该 return 只有一行。
问题: 如何只检索最新的joining_date
中的一个number
? DISTINCT
能保证吗?
编辑:我忽略了 postgres 标签,导致我的回答不是很有用。
原回答:
有几个选项,我一般用CROSS APPLY:
SELECT ac.number, ac.joining_date
FROM accounts ac
CROSS APPLY (SELECT TOP 1 a.number, a.joining_date
FROM accounts a
WHERE a.number = ac.number AND a.joining_date = ac.joining_date
ORDERBY a.joining_date DESC) iac
另一种选择是在子查询中使用 Row_Number() OVER (PARTITION BY a.number ORDER BY a.joining_date DESC) as rownum
,同时还添加 WHERE rownum=1
以确保只有一个匹配项。
使用 DISTINCT ON 子句:
SELECT DISTINCT ON(number) number, joining_date
FROM accounts
ORDER BY number, joining_date DESC
我有一个包含一些列的 table,其中有两个 - number
、joining_date
。
我要select的是最新加入日期和匹配号码。我创建了以下脚本:
SELECT ac.number, ac.joining_date
FROM accounts ac
INNER JOIN (
SELECT number, MAX(joining_date) as maxDate FROM accounts GROUP BY number
) iac ON ac.number = iac.number AND ac.joining_date = iac.maxDate;
看起来不错,但是,我注意到当 joining_date
相等时,即 2020-04-02 10:17:00.000000
对于多个记录, number
在结果中出现两次,即使MAX
应该 return 只有一行。
问题: 如何只检索最新的joining_date
中的一个number
? DISTINCT
能保证吗?
编辑:我忽略了 postgres 标签,导致我的回答不是很有用。
原回答:
有几个选项,我一般用CROSS APPLY:
SELECT ac.number, ac.joining_date
FROM accounts ac
CROSS APPLY (SELECT TOP 1 a.number, a.joining_date
FROM accounts a
WHERE a.number = ac.number AND a.joining_date = ac.joining_date
ORDERBY a.joining_date DESC) iac
另一种选择是在子查询中使用 Row_Number() OVER (PARTITION BY a.number ORDER BY a.joining_date DESC) as rownum
,同时还添加 WHERE rownum=1
以确保只有一个匹配项。
使用 DISTINCT ON 子句:
SELECT DISTINCT ON(number) number, joining_date
FROM accounts
ORDER BY number, joining_date DESC