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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PostgreSQL DISTINCT ON與不同的ORDER BY

PostgreSQL DISTINCT ON與不同的ORDER BY

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


查看完整回答
反對 回復 2019-08-26
?
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


查看完整回答
反對 回復 2019-08-26
?
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。


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 1851 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號