我正在嘗試獲取查詢的行。其中每組 id 的最小 end_date 中的行 value1、value2 等于最大 end_date。
我當前的查詢僅從查詢結果中的 max end_date 中獲取行 value1、value2:
select a.id, a.end_date, a.value1, a.value2
from table1 as a
inner join (
select id, max(end_date) as end_date
from database1
group by id
) as b
on a.id = b.id and a.end_date = b.end_date
order by id, end_date
此結果獲取最新記錄,但我希望獲取 min(end_date = max(end_date) 中 value1 & value2 的行,按 id 分組。
這是一個示例查詢,詳細說明了我想要獲得的內容:
| ID | 結束日期 | 價值1 | 價值2 |
|---|---|---|---|
| 蘋果 | 02/12/22 | 2 | 1 |
| 蘋果 | 22/13/02 | 2 | 1 |
| 蘋果 | 22/14/02 | 3 | 2 |
| 蘋果 | 02/15/22 | 3 | 2 |
| 微軟 | 22 年 3 月 1 日 | 2 | 5 |
| 微軟 | 03/02/22 | 4 | 5 |
| 微軟 | 22 年 3 月 3 日 | 4 | 5 |
| 微軟 | 22 年 3 月 4 日 | 4 | 5 |
從前面的查詢中,我需要獲取的查詢如下:
| ID | 結束日期 | 價值1 | 價值2 |
|---|---|---|---|
| 蘋果 | 22/14/02 | 3 | 2 |
| 微軟 | 03/02/22 | 4 | 5 |
所以再一次,我需要按 id 分組的 min(end_date) = max(end_date) 中的 value1, value2 的行。
uj5u.com熱心網友回復:
你可以用 row_number()
select id, end_date, value1, value2
from (
select t1.*, row_number() over(partition by t1.id order by t1.end_date) rn
from tbl t1
join (
select id, end_date, value1, value2
from (
select t.*, row_number() over(partition by id order by end_date desc) rn
from tbl t
) t
where rn = 1
) t2 on t1.id = t2.id and t1.value1 = t2.value1 and t1.value2 = t2.value2
) t
where rn = 1
db<>小提琴
uj5u.com熱心網友回復:
您可以使用distinct on兩次,一次on(id, value1, value2)在派生表中獲取 (value1, value2) 更改時的行,然后在外部查詢on(id)中獲取 (value1, value2) 最后更改的行:
select distinct on(id) * from
(select distinct on(id, value1, value2) id, end_date, value1, value2
from table1
order by id, value1, value2, end_date) t
order by id, end_date desc;
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439770.html
標籤:sql PostgreSQL
