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。
请不要投反对票。我已经尝试这样做了大约两天。我可以在评论中澄清任何困惑。
获得预期结果的一种选择是在 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
通常是可能导致问题的关键词。建议不要使用关键字作为表名或列名。
尝试一下这个样本小提琴