gpt4 book ai didi

sql - 在SQLite中将术语排除在GROUP BY之外?

转载 作者:行者123 更新时间:2023-12-03 19:17:16 24 4
gpt4 key购买 nike

当我开始使用SQLite时,我注意到GROUP BY使您可以忽略未聚合的术语。例:

SELECT month, category, max(quantity)
from Table1
GROUP BY month;


这将给我一个输出,我每个月都会得到 max(quantity),但随后我还会得到 category的值。

category实际上给我什么?它是否为我提供了映射到该月的max(quantity)的类别(通常我必须通过自连接来完成)?还是完全武断(如果完全武断,为什么他们不只是给我一个错误而不是让我认为我的查询有效??)?

我会忽略这样一个事实,那就是它让我做为疏忽大意,只是我发现 this tutorial看起来像他们利用了这样的事实,即您可以将条款排除在组之外(除非我对教程有误解) 。

编辑我也只是尝试了一下,发现下面的两个查询给了我完全相同的输出:

这两个查询都在寻找每个cust_id的max(update_at)值,然后还输出该cust_id的段。

查询1(使用自连接):

SELECT seg.cust_id, seg.seg_name, temp.max_update
FROM segments as seg
INNER JOIN
(
SELECT cust_id, MAX(update_at) AS max_update
FROM segments
WHERE DATE(update_at) <= "2016-03-01"
GROUP BY cust_id
) as temp
ON
seg.cust_id = temp.cust_id AND
seg.update_at = temp.max_update;


愚蠢的SQLite查询(利用SQLite的“怪癖”):

    SELECT cust_id,seg_name, MAX(update_at) 
FROM segments
WHERE DATE(update_at) <= "2016-03-01"
GROUP BY cust_id;


那么这仅仅是他们返回完全相同的结果的巧合吗?还是我错过了什么?我反复运行第二个版本,看看它是否会给我带来不同的结果,并且每次都能给我相同的结果。

最佳答案

SQLite允许聚合查询中的裸列与MySQL兼容。您get the values from some random row in the group,因此仅当您知道这些值实际上在组中相同时才有用。

但是,有一个extension适用于您的情况:


在聚合查询中使用min()或max()聚合函数时,结果集中的所有裸列都从输入行中获取值,该行还包含最小值或最大值。


因此,您的查询可以保证正常工作。

关于sql - 在SQLite中将术语排除在GROUP BY之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013306/

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