【问题标题】:mysql - total sum of all grouped count(*) 's with order by and limit (fiddle included)mysql - 所有分组 count(*) 的总和,按顺序和限制(包括小提琴)
【发布时间】:2020-08-17 08:00:12
【问题描述】:

无法弄清楚这一点...我知道下面有什么问题,但不确定如何获得我想要的结果。如果没有大量额外的重构,就不可能有两个单独的查询,我想通过这样做来避免这是一个查询......即使 TotalSum 对于集合中的每个结果都是重复的。

SELECT
    data_logs.event_target AS Name,
    COUNT(*) AS Total,
    SUM(COUNT(*)) OVER() AS TotalSum                    
FROM data_logs

GROUP BY Name
ORDER BY Total DESC
LIMIT 10

我想要TotalSum 成为所有分组 COUNT(*) 的总和(在本例中为 10)。问题是“窗口执行发生在 ORDER BY、LIMIT 和 SELECT DISTINCT 之前”,所以总数最终是错误的......它是所有行的总数,而不是我的限制的“前 10”。

Array
(
    [0] => Array
        (
            [Name] => somename0
            [Total] => 11
            [TotalSum] => 61
        )

    [1] => Array
        (
            [Name] => somename1 
            [Total] => 4
            [TotalSum] => 61
        )

    [2] => Array
        (
            [Name] => somename2 
            [Total] => 3
            [TotalSum] => 61
        )

    [3] => Array
        (
            [Name] => somename3 
            [Total] => 2
            [TotalSum] => 61
        )

    [4] => Array
        (
            [Name] => somename4
            [Total] => 2
            [TotalSum] => 61
        )

    [5] => Array
        (
            [Name] => somename5
            [Total] => 2
            [TotalSum] => 61
        )

    [6] => Array
        (
            [Name] => somename6 
            [Total] => 2
            [TotalSum] => 61
        )

    [7] => Array
        (
            [Name] => somename7
            [Total] => 1
            [TotalSum] => 61
        )

    [8] => Array
        (
            [Name] => somename8
            [Total] => 1
            [TotalSum] => 61
        )

    [9] => Array
        (
            [Name] => somename9
            [Total] => 1
            [TotalSum] => 61
        )

)

在上面的[TotalSum] 中,所有这些值都应该是 29...所有 10 个 [Total] 值的总和。

小提琴: https://www.db-fiddle.com/f/agn932Q9eXxhcm3CE26THe/2

【问题讨论】:

    标签: mysql sql group-by window-functions sql-limit


    【解决方案1】:

    您可以先在子查询中聚合和限制,然后计算总计:

    SELECT t.*, SUM(total) OVER() AS TotalSum
    FROM (
        SELECT event_target AS Name, COUNT(*) AS Total
        FROM data_logs
        GROUP BY Name
        ORDER BY Total DESC
        LIMIT 10
    ) t
    

    【讨论】:

    • 是的……这正是我想要的。谢谢!
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多