我想獲得我的資料庫中近20個欄位的最大值。我的問題是,我還想獲得其他一些欄位的所有這些MAX值。我使用的是PostgreSQL。
。這里有一個例子:
匹配表定義
CREATE TABLE "matches" (
"id" int4 NOT NULL DEFAULT nextval('match_players_id_seq'::regclass) 。
"kills" int4 NOT NULL,
"死亡" int4 NOT NULL,
"助攻" int4 NOT NULL,
"gamemode" int4 NOT NULL,
PRIMARY KEY ("id")
);
匹配表示例資料
| id | 殺戮 | 死亡數助攻數 | 助攻gamemode|
|---|---|---|---|
| 1 | 0 | 0 | 2 |
INSERT INTO "matches" ("id", "kills", "deals", "assists", "gamemode") VALUES
(1, 0, 0, 3, 1) 。
(2, 1, 0, 2, 2) 。
(3, 1, 12, 0, 3) 。
(4, 7, 2, 27, 1) 。
(5, 1, 4, 27, 2) 。
(6, 2, 3, 1, 3) 。
我想從上述資料中得到的結果(表格或JSON風格)
{
"maxKills"/span>: {"id"/span>: 4, "kills": 7, "gamemode": 1}。
"maxDeaths"/span>: {"id"/span>: 3, "deals": 12, "gamemode": 3}。
"maxAssists"/span>: {"id"/span>: 4, "assists": 27, "gamemode": 1}。//獲得第一個,如果2個相等。
}
這是簡化的。這里有一個小的Pastebin,讓你對真正的查詢有一個概念。https://pastebin.com/eT8MNKKe
另一個是@Erwin答案的實作的粘貼庫。https://pastebin.com/2B8imJTj
我已經在兩年前發布了這個問題,但我使用的是NoSQL資料庫(Mongo)。使用mongodb中的聚合功能獲取包含多個欄位最大值的物件
這是我的想法,我不知道這是否是最好的想法:
做兩個查詢。第一個是獲取20個列的最大值,第二個是用WHERE子句在20個聚合的MAX值上獲取記錄。我只是不確定當多條記錄具有相同的MAX值時該如何做。
uj5u.com熱心網友回復:
你想獲得具有最大值的行。一個SQL結果是一個由列和行組成的表。這是一個純SQL的方法:
select what, amount, gamemode, id
from
(
select id, gamemode, 'kills' as what, killsas amount, max(kills) over () as max_amount from mytable
unionall
select id, gamemode, 'deals' as what, deathsas amount, max(deads) over () as max_amount from mytable
unionall
select id, gamemode, 'assists' as what, assistsas amount, max(assists) over () as max_amount from mytable
unionall
...
) all_candidates
where amount = max_amount。
可能有一些內置的JSON函式來將這個結果轉換為JSON。我不知道。也許其他人可以回答這個問題。
uj5u.com熱心網友回復:
完美。你可以像我懷疑的那樣使用視窗版的max。唯一真正的困難是設計一些東西來分割它,而不是為每一行獲取數值。
select m.* , *
, max(m.kills ) over ( ) max_kills
, max(m.deads ) over () max_deaths
, max(m.assists ) over () max_assists
, max(m.gamemode ) over () max_gamemode
from matches m;
參見demo。為了演示,我添加了幾個列,只是為了顯示包含 "其他列",但并沒有填充它們。
注意:不是直接相關的,但你應該避免在資料庫名稱上使用雙引號(")。一旦使用它們,就必須始終使用。這實在是不值得一試。
uj5u.com熱心網友回復:
這應該是最快和最簡單的:
(SELECT 'kills' AS what, kills, gamemode, id FROM matches ORDER BY kills DESC, id LIMIT 1)
UNIONALL
(SELECT 'dames' , deaths, gamemode, id FROM matches ORDER BY deaths DESC, id LIMIT 1)
UNIONALL
(SELECT 'assists' , assists, gamemode, id FROM matches ORDER BY assistsDESC, id LIMIT 1)
--更多 ...
db<>fiddle here
添加id作為第二個ORDER BY表達。這樣,如果多行并列獲得最高分,則選擇具有最小的id的行。
所有的括號都是必須的。參見:
如果任何一個ORDER BY列可以是NULL,添加NULLS LAST。見:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306832.html
標籤:
