【问题标题】:sum of the three largest values in a column, per group每组一列中三个最大值的总和
【发布时间】:2017-08-20 21:46:23
【问题描述】:

我在一个 CS 问题网站上遇到了这个问题,但我不知道该怎么做。

Problem

我的第一个解决方案在这段代码中遇到了死胡同

SELECT 
 recipient
FROM 
 transfers
GROUP BY
 recipient
HAVING
 sum(amount) >= 1024
ORDER BY
 recipient ASC;

但是没有办法限制总和以求最大 3 个值的总和。

另一个想法是创建一个子查询并连接两个表。

像这样

SELECT
recipient,
(   SELECT SUM(amount)
    FROM transfer t1
    WHERE t1.recipient = t.recipient ORDER BY amount DESC LIMIT 3) as summedValue
FROM
transfer t

但是,它汇总了所有值,而不仅仅是前三个值。

【问题讨论】:

    标签: sqlite aggregate-functions limit-per-group


    【解决方案1】:

    对于一个特定的收件人,以下查询获取(最多)三个最大的传输:

    SELECT *
    FROM transfers
    WHERE recipient = ?
    ORDER BY amount DESC
    LIMIT 3;
    

    要获取这些传输的全部金额,请将其包装到子查询中(否则,LIMIT 将在聚合之后执行):

    SELECT sum(amount)
    FROM (SELECT *
          FROM transfers
          WHERE recipient = ?
          ORDER BY amount DESC
          LIMIT 3);
    

    然后使用它来过滤帐户(DISTINCT 子查询确保每个帐户只检查一次):

    SELECT recipient
    FROM (SELECT DISTINCT recipient
          FROM transfers) AS r
    WHERE (SELECT sum(amount)
           FROM (SELECT *
                 FROM transfers
                 WHERE recipient = r.recipient
                 ORDER BY amount DESC
                 LIMIT 3)
          ) >= 1024;
    

    【讨论】:

    • 非常感谢。您能向我解释一下使用 group by/have 和 where 之间的区别吗?
    • HAVING 在聚合之后执行,WHERE 之前。但我的回答使用子查询来控制执行顺序。
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2017-04-18
    • 2020-05-25
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2018-03-12
    • 2016-03-19
    相关资源
    最近更新 更多