gpt4 book ai didi

sqlite - 是否有关于 GROUP BY 查询中非聚合列的保证?

转载 作者:行者123 更新时间:2023-12-05 04:49:40 25 4
gpt4 key购买 nike

假设我们在 SQLite 中有下表和查询:

<表类="s-表"><头>id值 parent <日>信 <正文>1310一个2310b3010c4520d
SELECT id, MAX(val), parent, letter FROM table GROUP BY parent

关于 id 的值是否有任何保证? ?在 MySQL 中甚至有一种模式禁止选择非聚合值。如果没有这样的保证,是否有可能以某种方式为每个 parent 获得一行?

<表类="s-表"><头>id最大(值) parent <日>信 <正文>1†310一个4520d

† 或 2(只要 letter 来自同一行即可)

最佳答案

此行为包含在 S ELECT/Simple Select Processing/Side note: Bare columns in an aggregate queries 中.

在您的查询中,idletter 列未聚合且未包含在 GROUP BY 子句中,称为 < em>裸列。
因为您使用了 MAX() 聚合函数,所以这两列的值:

... take values from the input row which also contains the minimum ormaximum

但是,由于对于同一 parent,可能存在超过 1 行具有最大 val:

There is still an ambiguity if two or more of the input rows have thesame minimum or maximum value

这意味着对于您的示例数据,无法保证对于parent = 10,您将获得 id = 1 的行结果。
您可能会得到 id = 2 的行,其中还包含最大 val

假设在这种情况下,对于同一父级,可能存在超过 1 行具有最大 val,您需要具有最小 id 的行,你可以用 window functions 来做:

SELECT id, val, parent, letter
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY parent ORDER BY val DESC, id) rn
FROM tablename
)
WHERE rn = 1

或:

SELECT DISTINCT
FIRST_VALUE(id) OVER (PARTITION BY parent ORDER BY val DESC, id) id,
MAX(val) OVER (PARTITION BY parent) val,
parent,
FIRST_VALUE(letter) OVER (PARTITION BY parent ORDER BY val DESC, id) letter
FROM tablename

参见 demo .

关于sqlite - 是否有关于 GROUP BY 查询中非聚合列的保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67536804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com