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

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

必須出現(xiàn)在GROUP BY子句中或在聚合函數(shù)中使用

必須出現(xiàn)在GROUP BY子句中或在聚合函數(shù)中使用

富國(guó)滬深 2019-10-14 15:01:29
我有一張桌子,看起來(lái)像這個(gè)調(diào)用方“ makerar” cname  | wmname |          avg           --------+-------------+------------------------ canada | zoro   |     2.0000000000000000 spain  | luffy  | 1.00000000000000000000 spain  | usopp  |     5.0000000000000000我想為每個(gè)cname選擇最大平均。SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;但是我會(huì)出錯(cuò)ERROR:  column "makerar.wmname" must appear in the GROUP BY clause or be used in an   aggregate function LINE 1: SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;所以我這樣做SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname, wmname;但是,這不會(huì)給出預(yù)期的結(jié)果,并且下面顯示了錯(cuò)誤的輸出。 cname  | wmname |          max           --------+--------+------------------------ canada | zoro   |     2.0000000000000000 spain  | luffy  | 1.00000000000000000000 spain  | usopp  |     5.0000000000000000實(shí)際結(jié)果應(yīng)為 cname  | wmname |          max           --------+--------+------------------------ canada | zoro   |     2.0000000000000000 spain  | usopp  |     5.0000000000000000我該如何解決這個(gè)問(wèn)題?注意:此表是根據(jù)上一個(gè)操作創(chuàng)建的VIEW。
查看完整描述

3 回答

?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

是的,這是一個(gè)常見的聚合問(wèn)題。在SQL3(1999)之前,所選字段必須出現(xiàn)在GROUP BY子句[*]中。


要變通解決此問(wèn)題,您必須在子查詢中計(jì)算聚合,然后將其自身與之合并以獲得您需要顯示的其他列:


SELECT m.cname, m.wmname, t.mx

FROM (

    SELECT cname, MAX(avg) AS mx

    FROM makerar

    GROUP BY cname

    ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg

;


 cname  | wmname |          mx           

--------+--------+------------------------

 canada | zoro   |     2.0000000000000000

 spain  | usopp  |     5.0000000000000000

但是您也可以使用窗口函數(shù),它看起來(lái)更簡(jiǎn)單:


SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx

FROM makerar

;

此方法唯一的作用是它將顯示所有記錄(窗口功能不分組)。但是它將在每行中顯示正確的國(guó)家(即cname最高級(jí)別)MAX,由您決定:


 cname  | wmname |          mx           

--------+--------+------------------------

 canada | zoro   |     2.0000000000000000

 spain  | luffy  |     5.0000000000000000

 spain  | usopp  |     5.0000000000000000

僅顯示(cname, wmname)與最大值匹配的元組的解決方案(可能不太優(yōu)雅)是:


SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */

    m.cname, m.wmname, t.avg AS mx

FROM (

    SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY avg DESC) AS rn 

    FROM makerar

) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1

;



 cname  | wmname |          mx           

--------+--------+------------------------

 canada | zoro   |     2.0000000000000000

 spain  | usopp  |     5.0000000000000000

[*]:有趣的是,盡管規(guī)范允許選擇未分組的字段,但主要引擎似乎并不真正喜歡它。Oracle和SQLServer根本不允許這樣做。Mysql以前默認(rèn)情況下允許它,但是現(xiàn)在從5.7開始,管理員需要ONLY_FULL_GROUP_BY在服務(wù)器配置中手動(dòng)啟用此選項(xiàng)()以支持此功能...


查看完整回答
反對(duì) 回復(fù) 2019-10-14
?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

在Postgres中,您還可以使用特殊DISTINCT ON (expression)語(yǔ)法:


SELECT DISTINCT ON (cname) 

    cname, wmname, avg

FROM 

    makerar 

ORDER BY 

    cname, avg DESC ;


查看完整回答
反對(duì) 回復(fù) 2019-10-14
?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

在selects中指定非分組字段和非聚合字段的問(wèn)題group by在于,在這種情況下,引擎無(wú)法知道應(yīng)該返回哪個(gè)記錄的字段。首先嗎 最后嗎?通常沒(méi)有自然與匯總結(jié)果相對(duì)應(yīng)的記錄(min并且max是例外)。


但是,有一種解決方法:也將必填字段匯總在一起。在posgres中,這應(yīng)該起作用:


SELECT cname, (array_agg(wmname ORDER BY avg DESC))[1], MAX(avg)

FROM makerar GROUP BY cname;

請(qǐng)注意,這會(huì)創(chuàng)建一個(gè)由wg排序的所有wname的數(shù)組,并返回第一個(gè)元素(postgres中的數(shù)組基于1)。


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

添加回答

舉報(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)