我有一個包含以下列的表格:
| order_id | 數量 | 評分 | 百分 | 客戶ID | ref_id | doc_id |
|---|---|---|---|---|---|---|
| 1 | 1000 | 1 | 0.6 | 112 | 8 | 5 |
| 2 | 2000 | 2 | 0.1 | 111 | 8 | 8 |
| 2 | 3000 | 3 | 0.2 | 110 | 8 | 6 |
| 3 | 4000 | 5 | 0.1 | 100 | 7 | 7 |
| 3 | 4000 | 2 | 0.7 | 124 | 7 | 9 |
| 3 | 5000 | 4 | 0.6 | 143 | 5 | 10 |
| 4 | 2000 | 6 | 0.4 | 125 | 4 | 11 |
| 4 | 2500 | 1 | 0.55 | 185 | 4 | 12 |
| 4 | 1000 | 4 | 0.42 | 168 | 5 | 13 |
| 4 | 1200 | 8 | 0.8 | 118 | 1 | 14 |
對于每個 order_id,我想找到具有最高金額、最高評級、最高百分比、最低 customer_id 的 doc_id。
對于單個訂單 ID,我可以這樣做:
select order_id, doc_id
from orders
where order_id = 1625
order by amount desc nulls last,
rating desc nulls last,
percent desc nulls last,
customer_id asc
limit 1;
但我無法完成所有訂單。所以輸出應該是這樣的:
| order_id | doc_id |
|---|---|
| 1 | 5 |
| 2 | 6 |
| 3 | 10 |
| 4 | 12 |
我正在使用 Postgresql。知道我應該怎么做嗎?
uj5u.com熱心網友回復:
使用FIRST_VALUE()視窗函式:
SELECT DISTINCT order_id,
FIRST_VALUE(doc_id) OVER (
PARTITION BY order_id
ORDER BY amount DESC NULLS LAST, rating DESC NULLS LAST, percent DESC NULLS LAST, customer_id
) doc_id
FROM orders;
請參閱演示。
uj5u.com熱心網友回復:
看起來您需要在視窗中實作行編號,按您想要的標準排序:
with t as (
select *,
Row_Number()
over(partition by order_id
order by amount desc, rating desc, percent desc, customer_id
) seq
from Yourtable
)
select order_id, doc_id
from t
where seq=1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408973.html
標籤:
下一篇:如何使用聯接重建此查詢
