Helenr
2019-08-26 17:39:56
PostgreSQL DISTINCT ON與不同的ORDER BY我想運行此查詢:SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*FROM purchasesWHERE purchases.product_id = 1ORDER BY purchases.purchased_at DESC但我得到這個錯誤:PG ::錯誤:錯誤:SELECT DISTINCT ON表達式必須與初始ORDER BY表達式匹配添加address_id為第一個ORDER BY表達式會使錯誤無效,但我真的不想添加排序address_id。是否可以不通過訂購address_id?
3 回答

浮云間
TA貢獻1829條經(jīng)驗 獲得超4個贊
文件說:
DISTINCT ON(expression [,...])僅保留給定表達式求值的每組行的第一行。[...]請注意,除非使用ORDER BY確保首先顯示所需的行,否則每個集合的“第一行”都是不可預測的。[...] DISTINCT ON表達式必須與最左邊的ORDER BY表達式匹配。
因此,您必須將address_id
訂單添加到訂單中。
或者,如果您正在尋找包含最新購買的產(chǎn)品的完整行,address_id
并且該結果按purchased_at
那時排序,則您嘗試解決每組最大的N問題,可以通過以下方法解決:
應該適用于大多數(shù)DBMS的一般解決方案:
SELECT t1.* FROM purchases t1JOIN ( SELECT address_id, max(purchased_at) max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id) t2ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_atORDER BY t1.purchased_at DESC
一個更基于PostgreSQL的解決方案基于@hkf的答案:
SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC) tORDER BY purchased_at DESC

BIG陽
TA貢獻1859條經(jīng)驗 獲得超6個贊
您可以在子查詢中通過address_id進行排序,然后在外部查詢中按所需順序排序。
SELECT * FROM (SELECT DISTINCT ON (address_id) purchases.address_id, purchases.* FROM "purchases" WHERE "purchases"."product_id" = 1 ORDER BY address_id DESC ) ORDER BY purchased_at DESC

MMMHUHU
TA貢獻1834條經(jīng)驗 獲得超8個贊
一個子查詢可以解決這個問題:
SELECT *FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ) pORDER BY purchased_at DESC;
領先的表達式ORDER BY
必須與列中的列一致DISTINCT ON
,因此您不能在同一列中按不同的順序排序SELECT
。
ORDER BY
如果要從每個集合中選擇特定行,則僅在子查詢中使用其他行:
SELECT *FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC -- get "latest" row per address_id ) pORDER BY purchased_at DESC;
如果purchased_at
可以NULL
,請考慮DESC NULLS LAST
。
添加回答
舉報
0/150
提交
取消