3 回答

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)()以支持此功能...

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 ;

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)。
- 3 回答
- 0 關(guān)注
- 7239 瀏覽
添加回答
舉報(bào)