我有一個orders表,它有一個主鍵id列、一個order_id列和一個created_date列:
===================================
ORDERS
===================================
id | order_id | created_date
-----------------------------------
1 | 178 | 2022-11-16 09:25:11
2 | 182 | 2022-11-18 08:44:19
3 | 178 | 2022-11-17 11:16:22
4 | 178 | 2022-11-18 14:55:41
5 | 195 | 2022-11-15 09:11:17
6 | 195 | 2022-11-16 21:22:32
7 | 146 | 2022-11-16 16:55:09
8 | 178 | 2022-11-16 04:39:16
9 | 121 | 2022-11-16 01:20:19
我想撰寫一個回傳created_date特定 最高值的查詢order_id,所以我嘗試使用MAX(). 但我也想回傳id最高created_date行的。在上面的示例中,假設我想回傳符合此條件的訂單 ID 178 的行:
SELECT MAX(o.created_date),
o.id
FROM orders o
WHERE o.order_id = 178
GROUP BY o.id;
問題是,當我像這樣撰寫查詢時,會回傳多行。我已經嘗試GROUP BY完全洗掉,但除此之外,我無法理解我需要對此查詢執行的操作以顯示以下資訊:
4 | 2022-11-18 14:55:41
我如何撰寫 PostgreSQL 查詢來顯示具有最高created_date值的行,同時顯示該行的其他資訊?
uj5u.com熱心網友回復:
您將不得不使用 CTE 來計算哪個是最新order_id的ROW_NUMBER()和正確的ORDER BY。之后,使用這個偽排序器選擇整行。
WITH ranked_order_ids_by_date AS (
SELECT
*,
ROW_NUMBER() over (PARTITION BY order_id ORDER BY created_date DESC) AS date_rank
FROM USERS
)
SELECT *
FROM ranked_order_ids_by_date
WHERE order_id = 178
AND date_rank = 1
小提琴手
uj5u.com熱心網友回復:
如果您不關心多個 order_id 具有相同的最新日期,您可以使用LIMIT:
SELECT id, order_id, created_date
FROM orders
WHERE order_id = 178
ORDER BY created_date DESC
LIMIT 1;
我可能會出現不同的訂單 ID,而您想獲取所有訂單 ID,例如使用視窗函式DENSE_RANK:
WITH o AS
(
SELECT orders.*, DENSE_RANK()
OVER (PARTITION BY order_id ORDER BY created_date DESC) AS sub
FROM orders
WHERE order_id = 178
)
SELECT id, order_id, created_date
FROM o
WHERE sub = 1
uj5u.com熱心網友回復:
一種簡單的方法是使用,而不是使用 來distinct on獲取最大值。是這樣的:order by descmax
select distinct on (order_id) id, order_id, created_date
from orders
order by order_id, created_date desc
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537422.html
