MySQL Error 1111 - Неправильное использование групповой функции при вложении оконных функций - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над созданием отчета SQL для таблицы answers:

id | created_at
1  | 2018-03-02 18:05:56
2  | 2018-04-02 18:05:56
3  | 2018-04-02 18:05:56
4  | 2018-05-02 18:05:56
5  | 2018-06-02 18:05:56

И вывод:

weeks_ago | record_count (# of rows per weekly cohort) | growth (%)
-4        | 21                                         |  22%
-3        | 22                                         | -12%
-2        | 32                                         |   2%
-1        |  2                                         |  20%
 0        | 31                                         |   0%

В данный момент мой запрос содержит ошибку:

1111 - Invalid use of group function

Что я здесь не так делаю?

SELECT  floor(datediff(f.created_at, curdate()) / 7) AS weeks_ago,
                count(DISTINCT f.id) AS "New Records in Cohort",
                100 * (count(*) - lag(count(*), 1) over (order by f.created_at)) / lag(count(*), 1) over (order by f.created_at) || '%' as growth
FROM answers f
WHERE f.completed_at IS NOT NULL
GROUP BY weeks_ago
HAVING count(*) > 1;

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я думаю, что вы хотите найти счетчик всех строк , исключая текущую строку.Я думаю, что вы можете отказаться от функции LAG следующим образом:

SELECT
    COUNT(*) OVER (ORDER BY f.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) x, -- running count before current row
    COUNT(*) OVER (ORDER BY f.created_at) y -- running count including current row

Вы можете делить и умножать все, что вы хотите.


Нет.вам просто нужно разделить GROUP BY и LAG OVER:

WITH cte AS (
    SELECT
        FLOOR(DATEDIFF(created_at, CURDATE()) / 7) AS weeks_ago,
        COUNT(DISTINCT id) AS new_records
    FROM answers
    WHERE 1 = 1 -- todo: change this
    GROUP BY weeks_ago
    HAVING 1 = 1 -- todo: change this
)
SELECT
    cte.*,
    100 * (
        new_records - LAG(new_records) OVER (ORDER BY weeks_ago)
    ) / LAG(new_records) OVER (ORDER BY weeks_ago) AS percent_increase
FROM cte

Fiddle

0 голосов
/ 21 сентября 2018

Вы не можете использовать lag, содержащую COUNT статистическую функцию, потому что она недопустима, когда вы используете статистическую функцию, содержащую статистическую функцию.

вы можете попытаться использовать подзапрос для ее создания.

SELECT weeks_ago,
       NewRecords "New Records in Cohort",
      100 * (cnt - lag(cnt, 1) over (order by created_at)) / lag(cnt, 1) over (order by created_at) || '%' as growth
FROM (
    SELECT floor(datediff(f.created_at, curdate()) / 7) AS weeks_ago, 
           COUNT(*) over(partition by weeks_ago order by weeks_ago) cnt,
           count(DISTINCT f.id) NewRecords,
           f.created_at
    FROM answers f
) t1
...