【发布时间】:2021-09-15 19:54:53
【问题描述】:
我想获得数据库中近 20 个字段的 MAX 值。我的问题是我还想要一些具有所有这些 MAX 值的其他字段。我正在使用 PostgreSQL。
这是一个例子:
匹配表定义
CREATE TABLE "matches" (
"id" int4 NOT NULL DEFAULT nextval('match_players_id_seq'::regclass),
"kills" int4 NOT NULL,
"deaths" int4 NOT NULL,
"assists" int4 NOT NULL,
"gamemode" int4 NOT NULL,
PRIMARY KEY ("id")
);
匹配表示例数据
| id | kills | deaths | assists | gamemode |
|---|---|---|---|---|
| 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 |
INSERT INTO "matches" ("id", "kills", "deaths", "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 样式)来自上述数据
| what | amount | gamemode | id |
|---|---|---|---|
| "kills" | 7 | 1 | 4 |
| "deaths" | 12 | 3 | 3 |
| "assists" | 27 | 1 | 4 |
{
"maxKills": {"id": 4, "kills": 7, "gamemode": 1},
"maxDeaths": {"id": 3, "deaths": 12, "gamemode": 3}
"maxAssists": {"id": 4, "assists": 27, "gamemode": 1} // Get the first one if 2 are equal
}
这是简化的。这里有一个小pastebin,可以让您了解真正的查询:https://pastebin.com/eT8MNKKe
还有另一个带有@Erwin 答案实现的pastebin:https://pastebin.com/2B8imJTj
两年前我已经发布了这个问题,但我使用的是 NoSQL 数据库 (Mongo):Get objects containing max values for multiple fields using aggregation in mongodb
这是我的想法,不知道是不是最好的:
做2个查询。第一个获取 20 列的 MAX 值,第二个获取包含 20 个聚合 MAX 值的 WHERE 子句的行。我只是不确定当多行具有相同的 MAX 值时该怎么做。
【问题讨论】:
-
请查看How to Ask。您需要发布您的表定义(不需要完整的定义,只需要 3,4 列您想要最大值)和一些测试数据和 tat 数据的预期结果,全部作为文本 - 没有图像乙>。但我猜你可以使用 max 函数的window 版本。类似
max(kills) over (partition by id)并为每个列名重复。那将只有 1 个查询。 -
首先,谢谢,我会检查这些链接。我确实放了我的表定义?这是降价而不是图像。我把想要的结果从 JS 更新为 JSON,可能更清楚一点。
-
Mark down 不是表定义,是描述。我无法复制/过去并针对它运行查询。抱歉,我想我应该说张贴表格 ddl。
-
我明白了!我已经更新了我的问题,我希望这是你的意思。这是我第一次真正导出这样的数据,我不得不删除 40 多个字段,所以我希望它不会被破坏。
-
@ErwinBrandstetter 我没有。我只是在寻求更多建议。我对我的问题所做的修改只是为了按照其他人的要求提供更多背景信息。
标签: sql postgresql greatest-n-per-group union-all