mysql - общая сумма всех сгруппированных count(*) с порядком и лимитом (включая скрипку)

Возникли проблемы с выяснением этого... Я знаю, что не так с приведенным ниже, но не знаю, как добиться желаемых результатов. Наличие двух отдельных запросов невозможно без дополнительного рефакторинга, которого я хочу избежать, выполняя это как один запрос... даже если 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].

FIDDLE: https://www.db-fiddle.com/f/agn932Q9eXxhcm3CE26THe/2


person user756659    schedule 02.05.2020    source источник


Ответы (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
person GMB    schedule 02.05.2020
comment
Да... это именно то, что я искал. Благодарю вас! - person user756659; 03.05.2020