gpt4 book ai didi

mysql - SQL - 对多列的所有时间、30 天和 90 天的数据进行汇总

转载 作者:行者123 更新时间:2023-12-01 04:19:24 25 4
gpt4 key购买 nike

后台:

我有看起来像这样的数据

date        src    subsrc   subsubsrc   param1  param2
2020-02-01 src1 ksjd dfd8 47 31
2020-02-02 src1 djsk zmnc 44 95
2020-02-03 src2 skdj awes 92 100
2020-02-04 src2 mxsf kajs 80 2
2020-02-05 src3 skdj asio 46 53
2020-02-06 src3 dekl jdqo 19 18
2020-02-07 src3 dskl dqqq 69 18
2020-02-08 src4 sqip riow 64 46
2020-02-09 src5 ss01 qwep 34 34

我正在尝试汇总过去 30 天和过去 90 天的所有时间(无滚动总和)

所以我的最终数据看起来像这样:
src     subsrc  subsubsrc   p1_all  p1_30   p1_90   p2_all  p2_30   p2_90
src1 ksjd dfd8 7 1 7 98 7 98
src1 djsk zmnc 0 0 0 0 0 0
src2 skdj awes 12 12 12 4 4 4
src2 mxsf kajs 6 6 6 31 31 31
src3 skdj asio 0 0 0 0 0 0
src3 dekl jdqo 20 20 20 17 17 17
src3 dskl dqqq 3 3 3 4 4 4
src4 sqip qwep 0 0 0 0 0 0
src5 ss01 qwes 15 15 15 2 2 2

关于数据:
  • 这只是虚拟数据,因此是不正确的。
  • 我的数据中有数万行。
  • 有十几个 src 列构成了表的键。
  • 有十几个参数列我必须对 30 和 90 以及所有时间求和。
  • param 列中也有空值。
  • 同一天和 src 列也可能有多行。
  • 每天都在添加新数据,并且可能每天都会运行查询以获取最新的 30、90 次所有时间数据。

  • 我试过的:

    这是我想出的:
    SELECT src, subsubsrc, subsubsrc,
    SUM(param1) as param1_all,
    SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 30 THEN param1 END) as param1_30,
    SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 90 THEN param1 END) as param1_90,
    SUM(param2) as param2_all,
    SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 30 THEN param2 END) as param2_30,
    SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 90 THEN param2 END) as param2_90,
    FROM `MY_TABLE`
    GROUP BY src
    ORDER BY src

    这实际上有效,但我可以预测对于多个来源甚至更多参数列,此查询将花费多长时间。

    我一直在尝试一种叫做“ 过滤聚合函数(或手动数据透视)”的解释 HERE .但我无法理解/为我的案例实现它。

    此外,我查看了数十个答案,其中大多数是每天的总和,或者是这种基本计算的复杂情况。也许我没有正确搜索它。

    如您所见,我是 SQL 新手,非常感谢您的帮助。

    最佳答案

    您的查询看起来不错;条件聚合是旋转数据集的规范方法。

    一种可能提高性能的方法是更改​​条件表达式中的日期过滤器:使用日期函数排除使用索引。

    相反,您可以将其表述为:

    select 
    src,
    subsrc,
    subsubsrc,
    sum(param1) as param1_all,
    sum(case when date >= current_date - interval 30 day then param1 end) as param1_30,
    sum(case when date >= current_date - interval 90 day then param1 end) as param1_90,
    sum(param2) as param2_all,
    sum(case when date >= current_date - interval 30 day then param2 end) as param2_30,
    sum(case when date >= current_date - interval 90 day then param2 end) as param2_90
    from my_table
    group by src, subsrc, subsubsrc
    order by src, subsrc, subsubsrc

    对于性能,以下索引可能会有所帮助: (src, subsrc, subsubsrc, date) .

    请注意,我在 src, subsrc, subsubsrc 中包含了所有三个非聚合列( group by )条款:从 MySQL 5.7 开始,默认情况下这是强制性的(尽管您可以使用 sql 模式来改变该行为) - 大多数其他数据库实现相同的约束。

    关于mysql - SQL - 对多列的所有时间、30 天和 90 天的数据进行汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282665/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com