這個問題在這里已經有了答案: 獲取具有列最大值的行 (35 個回答) GROUP BY 與 MAX(DATE) [重復] (6 個回答) Oracle SQL 查詢:根據時間檢索每組的最新值 [重復] (2 個回答) 回傳每組一列最大值的行 [重復] (3 個回答) 檢索表中不同 ID 的最大日期 [重復] (3 個回答) 2 天前關閉。
SELCT * FROM MyTable;
ID Status posted_date posted_by
---------------------------------------------------
0 invalid 01/01/2021 abc
1 in-progress 02/01/2021 xyz
0 invalid 03/01/2021 lmn
2 complete 04/01/2021 pqr
1 in-progress 05/01/2021 newton
2 complete 06/01/2021 einstein
2 complete 07/01/2021 jack
我需要按 ID 分組。然后按posted_date 降序排列。然后找出發布最新交易的用戶。
在這種情況下,我的預期輸出是,
ID Status posted_date posted_by
---------------------------------------------------
2 complete 07/01/2021 jack
1 in-progress 05/01/2021 newton
0 invalid 03/01/2021 lmn
以下是我嘗試過的。我沒有得到任何行。
SELECT COUNT(ID), ID, status, posted_by,posted_date
FROM MyTable
GROUP BY ID, status, posted_by,posted_date
HAVING COUNT(ID) > 1
ORDER BY posted_date DESC;
uj5u.com熱心網友回復:
您的問題是獲取最大日期的行,您有多種方法可以獲取它
SELECT ID, status, posted_by, posted_date
FROM MyTable
WHERE (id, posted_date) IN
(
SELECT id, MAX(posted_date)
FROM MyTable
GROUP BY id
)
ORDER BY id;
使用連接
SELECT t.ID, t.status, t.posted_by, t.posted_date
FROM MyTable t
INNER JOIN
(
SELECT id, MAX(posted_date) AS max_posted_date
FROM MyTable
GROUP BY id
) m
ON t.id = m.id AND t.posted_date = m.max_posted_date
ORDER BY t.id;
或者使用決議函式
SELECT *
FROM
(
SELECT ID, status, posted_by, posted_date,
ROW_NUMBER() OVER (PARTITION BY id ORDER by posted_date DESC) AS rn
FROM MyTable
)
WHERE rn = 1
ORDER BY id;
uj5u.com熱心網友回復:
看起來您不想使用聚合函式。看起來您想使用視窗函式。像這樣的東西(使用dense_rank或row_number而不是rank取決于你想如何處理關系)
with ranked_data as (
select t.*,
rank() over (partition by id
order by posted_date desc) rnk
from yourTable t
)
select *
from ranked_data
where rnk = 1
uj5u.com熱心網友回復:
架構和插入陳述句:
create table MyTable(ID int, Status varchar(100), posted_date date, posted_by varchar(50));
insert into MyTable values(0, 'invalid', date'2021-01-01','abc');
insert into MyTable values(1, 'in-progress', date'2021-01-02','xyz');
insert into MyTable values(0, 'invalid', date'2021-01-03','lmn');
insert into MyTable values(2, 'complete', date'2021-01-04','pqr');
insert into MyTable values(1, 'in-progress', date'2021-01-05','newton');
insert into MyTable values(2, 'complete' , date'2021-01-06','einstein');
insert into MyTable values(2, 'complete', date'2021-01-07','jack');
詢問:
with cte as
(
select ID,Status,posted_date,posted_by,
row_number()over(partition by id order by posted_date desc) as rn
from MyTable
)
select ID,Status,posted_date,posted_by from cte where rn=1
order by posted_date desc
輸出:
| ID | 地位 | 發表日期 | POSTED_BY |
|---|---|---|---|
| 2 | 完全的 | 07-JAN-21 | 杰克 |
| 1 | 進行中 | 05-JAN-21 | 牛頓 |
| 0 | 無效的 | 03-JAN-21 | 明尼蘇達州 |
db<>在這里擺弄
uj5u.com熱心網友回復:
您還可以使用keep density_rank聚合子句來做到這一點。
select ID
, max(STATUS)keep(dense_rank first order by POSTED_DATE desc) STATUS
, max(POSTED_DATE)keep(dense_rank first order by POSTED_DATE desc)POSTED_DATE
, max(POSTED_BY)keep(dense_rank first order by POSTED_DATE desc)POSTED_BY
from myTable t
group by ID
order by ID desc
;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314328.html
上一篇:獲取上周價格更新的產品
下一篇:OracleApex條件鏈接
