我有下表
ID NAME DATE VALUE
1 John 2022-02-01 27
2 John 2022-02-01 9
3 John 2022-01-31 -12
4 John 2021-12-15 32
5 Tom 2021-10-22 11
6 Tom 2021-05-05 201
7 Tom 2020-11-27 76
8 Bob 2022-01-07 43
9 Bob 2021-08-26 3
10 Bob 2021-05-13 12
11 Bob 2021-03-08 2
我想撰寫一個查詢,忽略DATE每個最新的行NAME
ID NAME DATE VALUE
3 John 2022-01-31 -12
4 John 2021-12-15 32
6 Tom 2021-05-05 201
7 Tom 2020-11-27 76
9 Bob 2021-08-26 3
10 Bob 2021-05-13 12
11 Bob 2021-03-08 2
不知道如何撰寫這樣的查詢....
uj5u.com熱心網友回復:
您可以使用rank()通過 descending 對行進行排名DATE,然后過濾掉 rank = 1 的行:
select ID, NAME, DATE, VALUE from
(select *,
rank() over(partition by NAME order by DATE desc) r
from table_name) t
where r > 1;
小提琴
uj5u.com熱心網友回復:
在撰寫查詢以回答獲取所有帶有(或不帶有)最高 X 的行時,您通常可以使用 Zakaria 的答案、DISTINCT ON 或橫向連接等視窗函式來解決它。
我個人更喜歡視窗函式的表現力,但有時橫向連接更好,因為它們可以提高性能
以下是如何使用lateral.
首先,我們需要投影一個表,其中對于原始表中的每一行,我們將其系結到其組中具有最新日期的行(即具有相同名稱的行)。
select users.*, latest_dates.* from users
left join lateral (
select u.* from users as u
where u.name = users.name AND u.date > users.date
order by u.date DESC
limit 1
) as latest_dates on true;
id | name | date | value | id | name | date | value
---- ------ --------------------- ------- ---- ------ --------------------- -------
1 | John | 2022-02-01 00:00:00 | 27 | | | |
2 | John | 2022-02-01 00:00:00 | 9 | | | |
3 | John | 2022-01-31 00:00:00 | -12 | 1 | John | 2022-02-01 00:00:00 | 27
4 | John | 2021-12-15 00:00:00 | 32 | 1 | John | 2022-02-01 00:00:00 | 27
5 | Tom | 2021-10-22 00:00:00 | 11 | | | |
6 | Tom | 2021-05-05 00:00:00 | 201 | 5 | Tom | 2021-10-22 00:00:00 | 11
7 | Tom | 2020-11-27 00:00:00 | 76 | 5 | Tom | 2021-10-22 00:00:00 | 11
8 | Bob | 2022-01-07 00:00:00 | 43 | | | |
9 | Bob | 2021-08-26 00:00:00 | 3 | 8 | Bob | 2022-01-07 00:00:00 | 43
10 | Bob | 2021-05-13 00:00:00 | 12 | 8 | Bob | 2022-01-07 00:00:00 | 43
11 | Bob | 2021-03-08 00:00:00 | 2 | 8 | Bob | 2022-01-07 00:00:00 | 43
上面我們可以看到組中最新日期的行在右側將具有空值。因此,它只是創建查詢以排除此類值的一種情況。
select users.*, latest_dates.* from users
left join lateral (
select u.* from users as u
where u.name = users.name AND u.date > users.date
order by u.date DESC
limit 1
) as latest_dates on true
where latest_dates.date IS NOT NULL;
這將為您提供您正在尋找的結果。這是小提琴
uj5u.com熱心網友回復:
我們可以這樣做:
WITH max_date_table AS
(
SELECT MAX(DATE) AS max_date_value, NAME
FROM mytable
GROUP BY NAME
)
SELECT mytable.ID, mytable.NAME, mytable.DATE, mytable.VALUE
FROM mytable
INNER JOIN max_date_table
ON mytable.NAME=max_date_table.NAME
WHERE mytable.DATE != max_date_table.max_date_value
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443420.html
標籤:sql PostgreSQL
下一篇:使用包含重復元素的陣列選擇重復值
