第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

PostgreSQL DISTINCT ON與不同的ORDER BY

PostgreSQL DISTINCT ON與不同的ORDER BY

Helenr 2019-08-26 17:39:56
PostgreSQL DISTINCT ON與不同的ORDER BY我想運(yùn)行此查詢:SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*FROM purchasesWHERE purchases.product_id = 1ORDER BY purchases.purchased_at DESC但我得到這個(gè)錯(cuò)誤:PG ::錯(cuò)誤:錯(cuò)誤:SELECT DISTINCT ON表達(dá)式必須與初始ORDER BY表達(dá)式匹配添加address_id為第一個(gè)ORDER BY表達(dá)式會(huì)使錯(cuò)誤無(wú)效,但我真的不想添加排序address_id。是否可以不通過(guò)訂購(gòu)address_id?
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2019-08-26
?
BIG陽(yáng)

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


查看完整回答
反對(duì) 回復(fù) 2019-08-26
?
MMMHUHU

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。


查看完整回答
反對(duì) 回復(fù) 2019-08-26
  • 3 回答
  • 0 關(guān)注
  • 1879 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)