【问题标题】:How to do Week over Week Increase in SQL [closed]如何每周增加 SQL [关闭]
【发布时间】:2021-02-05 20:14:09
【问题描述】:

广告表:
- 每天每个广告一行

date    |   ad_id  | account_id | spend  
2018-05-01   123     1101        100  
2018-05-02   123     1101        125  
2018-05-03   124     1101        150  
2018-05-04   124     1101        150    
2018-05-04   125     1105        150  
2018-05-04   126     1105        150  
2018-05-04   123     1101        150  
2018-01-01   123     1101        150              

我正在尝试编写一个查询来找出:自 1 月 1 日以来每天的总支出和每周的变化。

因此,每周应显示第 8 天的总支出 - 第 1 天的总支出。我可以实现该滞后窗口功能,但是如果日期列中未提及第一天,我不确定该怎么做。假设 5 月的第一天没有支出,那么如果我使用了滞后功能,答案就会出错。有没有办法我可以编写一个查询来查找通过日期而不是滞后函数的总支出?如果第一天我没有消费,我可以得到 1200-0=1200 是 WOW 的变化。此外,我无法创建可以加入广告表的日期表。

到目前为止我已经写了这么多:

select dates, sum(spend) "total_spend_each_day",
from fb_ads as f
where dates>= '2018-01-01'
group by dates
order by 1;

期望的输出:

date     |  total_spend_each_day |  Week_over_week_change
2018-05-01       500                    Null
2018-05-02       600                    Null
2018-05-03       700                    Null
2018-05-04       800                    Null
2018-05-05       900                    Null
2018-05-06       1000                   Null
2018-01-07       1100                   Null
2018-01-08       1200                   700

【问题讨论】:

    标签: mysql sql date case window-functions


    【解决方案1】:

    只需使用lag()。假设您每天至少有一条记录:

    select dates, sum(spend) as total_spend_each_day,
           sum(spend) - lag(sum(spend), 7) over (order by dates) as diff
    from fb_ads as f
    where dates >= '2018-01-01'
    group by dates
    order by 1;
    

    如果您没有每天的数据,那么只需使用带有range() 的窗口框架:

    select dates, sum(spend) as total_spend_each_day,
           (sum(spend) -
            max(sum(spend)) over (order by dates range between interval 7 day and interval 7 day)
           ) as diff
    from fb_ads as f
    where dates >= '2018-01-01'
    group by dates
    order by 1;
    

    【讨论】:

    • 嗨,戈登,感谢您的评论。上一段我已经提到了,为什么我不能使用滞后功能,请过一下。
    • 第二个查询在某处有什么问题吗?
    • 查询错误:错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 3 行的“结束(按日期范围在 7 天和 7 天之间排序)a”附近使用
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多