PSQL 给定一个包含列 id、名称、日期的表,返回 id,其最近日期的名称为“John”

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

PSQL 给定一个包含 cols ids、名称、日期的表,返回 id,其最近日期的名称为“John”。有点难以描述,所以我有下表:

id 名字 日期
1 “约翰” '2020-01-01'
1 '史蒂夫' '2025-01-01'
2 “约翰” '2021-01-01'
2 '史蒂夫' '2020-01-01'
3 “约翰” '2022-01-01'
3 '史蒂夫' '2020-01-01'
4 “约翰” '2020-01-01'
4 '史蒂夫' '2022-01-01'

结果:最近名字为 John 的 Id。

id 名字 日期
2 “约翰” '2021-01-01'
3 “约翰” '2022-01-01'

我尝试过使用子查询。我尝试过将 desc limit 1 和 desc limit 1 与子查询一起使用。我似乎无法获得每个 id 的 desc limit 1。

我想要最近名字是 John 的 ID。

请不要投反对票。我已经尝试这样做了大约两天。我可以在评论中澄清任何困惑。

sql psql
1个回答
0
投票

获得预期结果的一种选择是在 CTE 中使用

ROW_NUMBER

WITH sorted AS
  (SELECT 
    id, 
    thename, 
    thedate,
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY thedate DESC) AS rn
  FROM yourtable)
SELECT 
  id, thename, thedate 
FROM sorted
WHERE
  thename = 'John' AND rn = 1
ORDER BY 
  id;

CTE 中的子查询将构建一个列,其中数字递增,并按最新日期排序。

然后在外部查询中,我们过滤掉所有具有其他名称的行以及所有数字不为 1 的行。

因此,每个 id 中仅保留名称为 John 的行,并且不存在具有其他名称的较晚日期。

旁注:我重命名了答案中的列,因为

name
,尤其是
date
通常是可能导致问题的关键词。建议不要使用关键字作为表名或列名。

尝试一下这个样本小提琴

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.