3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
文件說(shuō):
DISTINCT ON(expression [,...])僅保留給定表達(dá)式求值的每組行的第一行。[...]請(qǐng)注意,除非使用ORDER BY確保首先顯示所需的行,否則每個(gè)集合的“第一行”都是不可預(yù)測(cè)的。[...] DISTINCT ON表達(dá)式必須與最左邊的ORDER BY表達(dá)式匹配。
因此,您必須將address_id
訂單添加到訂單中。
或者,如果您正在尋找包含最新購(gòu)買的產(chǎn)品的完整行,address_id
并且該結(jié)果按purchased_at
那時(shí)排序,則您嘗試解決每組最大的N問(wèn)題,可以通過(guò)以下方法解決:
應(yīng)該適用于大多數(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
一個(gè)更基于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

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以在子查詢中通過(guò)address_id進(jìn)行排序,然后在外部查詢中按所需順序排序。
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

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
一個(gè)子查詢可以解決這個(gè)問(wèn)題:
SELECT *FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ) pORDER BY purchased_at DESC;
領(lǐng)先的表達(dá)式ORDER BY
必須與列中的列一致DISTINCT ON
,因此您不能在同一列中按不同的順序排序SELECT
。
ORDER BY
如果要從每個(gè)集合中選擇特定行,則僅在子查詢中使用其他行:
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
,請(qǐng)考慮DESC NULLS LAST
。
添加回答
舉報(bào)