我在 PostgreSQL 資料庫中有一個表,其中包含如下資料:
id customer_id item value timestamp
1 001 price 1000 11/1/2021
2 001 price 1500 11/2/2021
3 001 condition good 11/3/2021
4 002 condition bad 11/4/2021
5 002 condition good 11/5/2021
6 002 price 1000 11/6/2021
7 001 condition good 11/7/2021
8 001 price 1400 11/8/2021
9 002 price 1500 11/9/2021
10 001 condition ok 11/10/2021
11 002 price 1600 11/11/2021
12 002 price 1550 11/12/2021
從該表中,我想按日期查詢最新值并將其轉換為如下表。
customer_id price condition
001 1400 ok
002 1550 good
為了得到這種表,我嘗試使用下面的查詢,但是當資料太多時它不能很好地作業。(操作像Min和Max到文本和數字)
我在 pgAdmin 4 中對此進行了測驗:
SELECT customer_id,
MAX (Case WHEN item='price' THEN value END) price,
MAX (Case WHEN item='condition' THEN value END) condition
FROM table_name GROUP BY customer_id
我想通過最新的日期更新資料查詢值。
uj5u.com熱心網友回復:
您的關系設計可能會得到改進。在同一列中混合不同型別的資料是一種反模式。
雖然堅持給定的設定,兩個子查詢DISTINCT ON和一個FULL OUTER JOIN完成作業:
SELECT customer_id, p.value AS price, c.value AS condition
FROM (
SELECT DISTINCT ON (customer_id)
customer_id, value
FROM tbl
WHERE item = 'condition'
ORDER BY customer_id, timestamp DESC
) c
FULL JOIN (
SELECT DISTINCT ON (customer_id)
customer_id, value
FROM tbl
WHERE item = 'price'
ORDER BY customer_id, timestamp DESC
) p USING (customer_id)
db<>在這里擺弄
看:
- 選擇每個 GROUP BY 組中的第一行?
這假定timestamp已定義NOT NULL,否則您將需要NULLS LAST.
根據未公開的基數和值分布,可能會有(更快)查詢變體。
如果有一個customer帶有 distinct的表customer_id,(快得多)查詢樣式就成為可能。
這些部分的多列索引在任何情況下都非常適合使其快速:
CREATE INDEX tbl_condition_special_idx ON tbl (customer_id, timestamp DESC, value) WHERE item = 'condition';
CREATE INDEX tbl_price_special_idx ON tbl (customer_id, timestamp DESC, value) WHERE item = 'price';
看:
- 優化 GROUP BY 查詢以檢索每個用戶的最新行
uj5u.com熱心網友回復:
SELECT X.CUSTOMER_ID,X.PRICE,X.CONDITION
FROM
(
SELECT A.CUSTOMER_ID,A.PRICE,A.CONDITION,
ROW_NUMBER()OVER(PARTITION BY A.CUSTOMER_ID ORDER BY A.TIMESTAMP DESC)XCOL
FROM YOUR_TABLE A
)X WHERE X.XCOL=1
請您試試以上是否適合您
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366101.html
標籤:sql PostgreSQL的 每组最大 n
上一篇:Postgres資料庫性能問題
下一篇:如何使一行在一對多關系中唯一
