【问题标题】:How can I get the IDs of the rows that make up a GROUP BY ... HAVING query?如何获取组成 GROUP BY ... HAVING 查询的行的 ID?
【发布时间】:2010-11-30 10:17:39
【问题描述】:

我有以下查询,用于查找从同一客户中取消的交易(某些交易是否定的)。

SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
FROM table
GROUP BY c, magnitude
HAVING num > 1 AND total = 0
ORDER BY total

此查询的结果是客户 ID、订单数量、自行取消的订单总和(零)以及总和为零的交易数量。

我将如何获取构成 COUNT(*) 的行的 ID?

我希望得到一个包含这些行 ID 的单列结果集。

【问题讨论】:

    标签: sql group-by


    【解决方案1】:
    SELECT  id
    FROM    (
            SELECT  c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
            FROM    table
            GROUP BY
                    c, magnitude
            HAVING num > 1 AND total = 0
            ) td
    JOIN    table to
    ON      to.c = td.c
            AND to.r IN (magnitude, -magnitude)
    

    (c, r) 上创建索引将改进此查询。

    SQL ServerOraclePostgreSQL 8.4 中,您还可以执行以下操作:

    SELECT  id
    FROM    (
            SELECT  id,
                    SUM(r) OVER (PARTITION BY c, ABS(r)) total,
                    COUNT(*) OVER (PARTITION BY c, ABS(r)) num
            FROM    table
            ) q
    WHERE   num > 1 AND total = 0
    

    【讨论】:

    • 第二个查询也可以在 Sybase SQL Anywhere 上运行,这就是我正在做的。但是,它按原样返回一个空结果集。如果您从 SUM() 的总列中删除 ABS() 函数,它会按要求工作。如果您对 ABS() 求和,total 不能为零。
    【解决方案2】:

    出于某种原因,我认为标签上写的是 MySQL。我很笨。


    您可能需要考虑group_concat 函数,它可以让您拥有一个列,该列是将组中的所有 ID 串联在一起形成一个列表。

    除了人类阅读列表之外,它不会真正有用。如果您想根据结果进行更多查询或计算,那么这不是一个好的选择。

    但基本上你可以这样做:

    SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num,
      GROUP_CONCAT(ID SEPARATOR ', ') id_list
    FROM table
    GROUP BY c, magnitude
    HAVING num > 1 AND total = 0
    ORDER BY total
    

    【讨论】:

    • 我没有使用 MySQL,所以这不是我的解决方案,但它可能对其他人有所帮助。谢谢!
    • 我应该多加注意的。我可以发誓我看到了一个 MySQL 标签。我一定同时在看另一个问题。我留下这个答案,希望以后有人可以使用它。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2013-11-17
    • 2020-09-23
    相关资源
    最近更新 更多