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

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

1 Ответ

1 голос
/ 02 мая 2020

Вы можете объединить и ограничить сначала в подзапросе, а затем вычислить общий итог:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...