SQL,根据数据的时间跨度进行不同粒度的统计

MSSQL 的某个视图会生成时间跨度不同的数据,当时间跨度小于 30 天时:

|----|----------|------------|-------------------------|
| id | branchId | totalPrice | createdAt |
| 85 | 1 | 2718.66 | 2022-07-03 08:49:27.727 |
| 26 | 1 | 3832.69 | 2022-07-06 09:08:06.880 |
| 89 | 1 | 9569.85 | 2022-07-07 04:13:09.230 |
| 80 | 1 | 1523.62 | 2022-07-07 04:38:29.313 |
| 15 | 1 | 2500.21 | 2022-07-11 09:01:05.183 |
| 5 | 1 | 6874.03 | 2022-07-14 23:54:05.590 |
| 45 | 1 | 9188.03 | 2022-07-17 05:35:48.560 |
| 98 | 1 | 4426.17 | 2022-07-21 17:35:31.617 |
| 54 | 1 | 3862.86 | 2022-07-22 05:18:28.553 |
| 70 | 1 | 5668.82 | 2022-07-22 06:12:33.867 |
| 65 | 1 | 3653.67 | 2022-07-26 08:29:03.587 |

需要按branchId和日期分组,对 totalPrice 求和,结果应当如下:

|----------|---------------|------------|
| branchId | sumTotalPrice | timeFrame |
| 1 | 2718.66 | 2022-07-03 |
| 1 | 3832.69 | 2022-07-06 |
| 1 | 11093.47 | 2022-07-07 |
| 1 | 2500.21 | 2022-07-11 |
| 1 | 6874.03 | 2022-07-14 |
| 1 | 9188.03 | 2022-07-17 |
| 1 | 4426.17 | 2022-07-21 |
| 1 | 9531.68 | 2022-07-22 |
| 1 | 3653.67 | 2022-07-26 |

当时间跨度大于等于 30 天且小于 365 天时:

|----|----------|------------|-------------------------|
| id | branchId | totalPrice | createdAt |
| 52 | 4 | 7502.97 | 2023-11-01 17:49:51.110 |
| 56 | 4 | 7337.75 | 2023-11-06 15:38:57.567 |
| 44 | 4 | 9385.97 | 2024-01-18 11:19:04.460 |

则要按branchId和月份分组,对 totalPrice 求和。注意:格式保持不变,输出的时间字段取当月的第一天。

|----------|---------------|------------|
| branchId | sumTotalPrice | timeFrame |
| 4 | 14840.72 | 2023-11-01 |
| 4 | 9385.97 | 2024-01-01 |

当时间跨度大于等于 365 天时:

|----|----------|------------|-------------------------|
| id | branchId | totalPrice | createdAt |
| 22 | 2 | 5589.39 | 2020-05-23 15:22:14.703 |
| 46 | 2 | 6103.08 | 2020-08-18 03:58:14.973 |
| 48 | 2 | 4905.96 | 2020-10-14 23:57:48.680 |
| 85 | 2 | 8953.03 | 2021-08-15 11:16:34.627 |
| 6 | 2 | 8132.46 | 2021-08-26 21:27:21.627 |
| 53 | 2 | 1913.24 | 2021-09-20 17:41:13.793 |
| 4 | 2 | 3164.81 | 2022-03-18 04:24:40.840 |
| 28 | 2 | 3506.16 | 2022-05-20 17:48:44.330 |
| 37 | 2 | 7256.73 | 2022-07-25 20:45:16.497 |
| 16 | 2 | 7470.38 | 2023-01-22 18:33:07.163 |
| 27 | 2 | 5957.58 | 2023-03-22 03:04:02.687 |
| 99 | 2 | 7722.43 | 2023-04-14 21:22:38.160 |
| 81 | 2 | 4517.39 | 2023-04-25 11:25:17.900 |
| 70 | 2 | 5562.04 | 2023-05-10 08:19:35.200 |
| 55 | 2 | 9343.17 | 2023-11-17 08:56:09.870 |
| 94 | 2 | 1056.38 | 2024-01-03 18:36:24.743 |
| 47 | 2 | 8434.11 | 2024-03-23 09:07:31.743 |

要按branchId和年份分组,同样对 totalPrice 求和。注意:时间字段取当年的第一天。

|----------|---------------|------------|
| branchId | sumTotalPrice | timeFrame |
| 2 | 16598.43 | 2020-01-01 |
| 2 | 18998.73 | 2021-01-01 |
| 2 | 13927.7 | 2022-01-01 |
| 2 | 40572.99 | 2023-01-01 |
| 2 | 9490.49 | 2024-01-01 |

编写SPL代码

|---|-----------------------------------------------------------------------------------------------------------------------------------|
| |  A |
| 1 | =MSSQL.query("select * from tb") |
| 2 | =interval(A1.min(date(createdAt)),A1.max(date(createdAt))) |
| 3 | =A1.groups(branchId, date(createdAt,if(A2>=356:"yyyy",A2<30: "yyyy-MM-dd";"yyyy-MM")):timeFrame; sum(totalPrice):sumTotalPrice) |
| 4 | =A3.new(#1,#3,#2) |

A1:通过JDBC查询视图。

A2:计算时间跨度。

A3:分组汇总。当跨度大于365天时,时间格式掩码为yyyy,跨度小于30天时,掩码为yyyy-MM-dd,其他跨度时设置为yyyy-MM。date函数对yyyy掩码的时间字符串返回当年的第一天,对yyyy-MM掩码的时间字符串返回当月的第一天。

A4:调整字段顺序,以符合格式要求。

SPL已开源免费,欢迎下载试用

相关推荐
weixin_472339464 分钟前
MySQL MCP 使用案例
数据库·mysql
lqlj22331 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔2 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务2 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071612 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
拓端研究室TRL2 小时前
Python与MySQL网站排名数据分析及多层感知机MLP、机器学习优化策略和地理可视化应用|附AI智能体数据代码
人工智能·python·mysql·机器学习·数据分析
Ailovelearning3 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀4 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务4 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide
yc_12244 小时前
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
数据库·c#