代码之家  ›  专栏  ›  技术社区  ›  andraiamatrix

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

  •  1
  • andraiamatrix  · 技术社区  · 6 年前

    当我开始使用SQLite时,我注意到GROUP BY允许您不使用未聚合的术语。例子:

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

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

    类别 真的给我?它是否提供了映射到该月最大(数量)的类别(通常我必须通过自连接来完成)?或者完全武断(如果完全武断,为什么他们不给我一个错误,而让我认为我的查询有效?

    如果不是我发现 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; 
    

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

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   CL.    6 年前

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

    但是,有一个 extension

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

    所以你的查询肯定有效。

        2
  •  1
  •   sticky bit    6 年前

    "SELECT", "3. Generation of the set of result rows" :

    • (...)

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

    为什么会这样?很可能是因为SQLite的设计者/程序员决定这样做。可能是因为它更容易和/或他们不认为这很重要。和MySQL的人一样,顺便说一句,这里也是一样的,至少在较低版本或者有一些设置的情况下是这样。