我有以下觀點:
CREATE OR REPLACE VIEW {accountId}.last_assets AS
SELECT DISTINCT ON (coin) *
from {accountId}.{tableAssetsName}
ORDER BY coin, ts DESC;
該視圖為每個硬幣回傳最新更新。
并且,在一個不相關的問題中,評論是:
注意:DISTINCT 始終是一個危險信號。(幾乎總是)
我讀到了這個,它似乎與 Postgres 有性能問題。在我的場景中,我沒有任何性能問題,但我想了解:
那么如何將這樣的查詢重寫為不使用 DISTINCT 呢?
uj5u.com熱心網友回復:
DISTINCT和 Postgres 專有DISTINCT ON ()運算子之間存在實質性差異。
寫“ DISTINCT 總是一個危險信號”的人真的知道PostgresDISTINCT和DISTINCT ONPostgres之間的區別嗎?
您的視圖解決的問題稱為 每組最大 n并且在 Postgresdistinct on中通常比替代方案更有效。
這個問題可以用視窗函式來解決:
CREATE OR REPLACE VIEW {accountId}.last_assets AS
SELECT ....
FROM (
SELECT *,
row_number() over (partition by coin order by ts desc) as rn
from {accountId}.{tableAssetsName}
) t
WHERE rn = 1;
但是,如果這實際上比您當前的解決方案慢,我不會感到驚訝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/348639.html
標籤:PostgreSQL
上一篇:如何使用array_agg在此sql查詢中更正此語法錯誤
下一篇:Postgres獲取當前模式名稱
