首页 > 解决方案 > 在 SQLite 中将术语排除在 GROUP BY 之外?

问题描述

当我开始使用 SQLite 时,我注意到 GROUP BY 可以让您将未聚合的术语排除在外。例子:

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

这会给我一个输出,我得到max(quantity)每月,但我也得到一个值category

category实际上给了我什么?它是否为我提供了映射到当月最大(数量)的类别(我通常必须通过自加入来完成)?或者完全是任意的(如果完全是任意的,为什么他们不只是给我一个错误而不是让我认为我的查询有效???)?

我会忽略这样一个事实,即它让我将其视为疏忽,只是我发现本教程看起来像是利用了您可以将术语排除在组外的事实(除非我误解了本教程)。

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

两个查询都在查找每个 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;

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

标签: sqlsqlite

解决方案


“SELECT”,“3.生成结果行集”

  • (...) 结果集中的每个表达式然后为每组行计算一次。如果表达式是聚合表达式,则在组中的所有行中对其进行评估。否则,将根据组内任意选择的单个行对其进行评估。如果结果集中有多个非聚合表达式,则对同一行计算所有此类表达式。(...)

所以是的,您只从组内随机选择的行中获取值。

为什么会这样?好吧,可能是因为 SQLite 的设计者/程序员决定这样做。可能是因为它更容易和/或他们认为这并不重要。就像 MySQL 的人一样,顺便说一句。那里是一样的,至少在较低版本或某些设置中是一样的。


推荐阅读