MySQL错误1111-嵌套窗口函数时无效使用组函数

MySQL错误1111-嵌套窗口函数时无效使用组函数,mysql,sql,datetime,mariadb,window-functions,Mysql,Sql,Datetime,Mariadb,Window Functions,我正在创建一个关于answers表的SQL报告: 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

我正在创建一个关于
answers
表的SQL报告:

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;

不能使用
lag
contain
COUNT
aggregate函数,因为使用聚合函数contain aggregate函数时它无效

您可以尝试使用子查询来创建它

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

我想您需要查找所有行的运行计数不包括当前行。我认为您可以按如下方式放弃
滞后
功能:

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
你可以任意除法和乘法


没有。您只需将
分组按
滞后于

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

你能在SQLFiddle或类似网站上发布一个示例数据和模式,以便我们可以尝试吗?你不能在
LAG
函数中使用
COUNT(*)
,这就是为什么你会出错的原因。@RaymondNijland谢谢你。。关于如何使这项工作正常进行的任何建议?当前示例数据的预期结果应该是什么样的?我假设如果你在4周前查看,范围是….
2018-08-30到2018-09-26
?假设这个日期
2018-09-21
谢谢,但我试图让查询为每个记录输出一行,返回到数据库中第一条记录的开头…上面的查询只返回一条记录OK您能提供一些示例数据并期望结果吗?这真的很有帮助。我刚刚更新了问题以包括示例输出-不是%s实际上没有计算,但这应该是示例所需的格式。。。每周一行返回到数据库中的开始时间,以匹配答案中的记录。已创建链接供您编辑,但我的意思是您可以从
答案
表中提供一些示例数据。您的示例数据的预期结果是什么。thx但“发件人”、“位置”等中需要包含什么内容。。我无法运行您的查询,因为我的MySQL不允许部分分组。我将尝试在不分组的情况下创建一堆数据,希望您能找出其余的数据。好的,我不想尝试您的建议。。。你介意用完整的问题更新你的答案吗?这样我就可以跟进了?真的很感激!thx但这是为每条记录输出一行,其思想是每一行应按周分组。因此,每一行包括answers.created_在一周内(7天期间)的答案总数。这将允许我使用查询来查看我们每周的表现……请参阅修订的fiddle;它处理嵌套的窗口函数。现在关于分组的事情。。。我认为您将窗口功能和分组错误地混合在一起。但是我感觉很累,对不起。