【发布时间】:2020-06-02 13:53:19
【问题描述】:
背景:
我的数据看起来像这样
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 新手,非常感谢任何帮助。
【问题讨论】:
-
您使用的是 MySQL 还是 Big Query?这是两种不同的数据库产品,请仅标记相关的产品。
-
它的 MySQL,我将在 Google Cloud SQL 中编写新表。由于界面和速度的原因,我在 BigQuery 中测试了查询,并且错误地标记了 bigquery。
-
我如何知道问题被标记为关闭的原因。
-
“数万”?我怀疑它是否需要超过 1 秒。够快吗?
-
@RickJames。作为一名编码员,很多重复困扰着我。我只是觉得它可以改进。此外,数据会随着时间的推移而增长。
标签: mysql sql group-by pivot query-optimization