gpt4 book ai didi

sql - sql:在group by语句中包括未分组的列的合法性

转载 作者:行者123 更新时间:2023-12-03 17:58:22 25 4
gpt4 key购买 nike

在SQLite中,如果我这样做:

CREATE TABLE fraction (
id Int,
tag Int,
num Int,
den Int,
PRIMARY KEY (id)
);

INSERT INTO fraction VALUES (1,1,3,4);
INSERT INTO fraction VALUES (2,1,5,6);
INSERT INTO fraction VALUES (3,2,3,8);
INSERT INTO fraction VALUES (4,2,5,7);
INSERT INTO fraction VALUES (5,1,10,13);
INSERT INTO fraction VALUES (6,2,5,7);

SELECT fraction.tag, max(1.0 * fraction.num / fraction.den)
FROM fraction
GROUP BY fraction.tag;


我会得到结果:

1|0.833333333333333
2|0.714285714285714


然后,如果我发出:

SELECT fraction.tag, max(1.0 * fraction.num / fraction.den),
fraction.num, fraction.den
FROM fraction
GROUP BY fraction.tag;


我会得到结果:

1|0.833333333333333|5|6
2|0.714285714285714|5|7


后者是我所期望的,但似乎比任何可预见或可靠的事故都更令人高兴。例如,如果聚合函数是 sum而不是 min,则某种类型的“搭便车”列将没有意义。

在我当前正在做的项目中,我使用一个连接到自身的表来模拟后者:

SELECT DISTINCT fraction_a.tag, fraction_a.high,
fraction_b.num, fraction_b.den
FROM
(SELECT fraction.tag, max(1.0 * fraction.num / fraction.den) AS high
FROM fraction
GROUP BY fraction.tag)
AS fraction_a JOIN
(SELECT fraction.tag, fraction.num, fraction.den
FROM fraction)
AS fraction_b
ON fraction_a.tag = fraction_b.tag
AND fraction_a.high = 1.0 * fraction_b.num / fraction_b.den;


屈服

1|0.833333333333333|5|6
2|0.714285714285714|5|7


但是我发现该语法难看,不切实际且难以维护。

由于我将在多个SQL方言之间移植项目,因此我需要一个在所有方言中都可靠的解决方案。因此,如果我不得不硬着头皮使用丑陋的语法,那我会选择,但是我更喜欢使用清洁的语法。

最佳答案

使用GROUP BY时,数据库必须从(可能)多个输入行创建一个输出行。

GROUP BY子句中提到的列对于组中的所有行都具有相同的值,因此这是要使用的输出值。

具有某些聚合函数的列将使用该列来计算输出值。

但是,其他列是一个问题,因为该组中可能有不同的值。
SQL标准禁止这样做。
MySQL忘记检查此错误,并为输出提供了一些随机行的值。
SQLite允许这样做以与MySQL兼容。

从版本3.7.11开始,当您使用MIN或MAX时,SQLite保证其他列将来自具有最小值/最大值的记录。

关于sql - sql:在group by语句中包括未分组的列的合法性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24257066/

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