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已开源免费,欢迎下载试用

相关推荐
java叶新东老师9 分钟前
CMakelists.txt 实现多级目录编译
java·服务器·数据库
Sean_summer12 分钟前
暑期第二周
前端·数据库·python
whn197732 分钟前
达梦有多少个模式
数据库
王柏龙1 小时前
Entity Framework Core (EF Core) 中Database
数据库·microsoft
时序数据说1 小时前
时序数据库IoTDB的优势场景分析
大数据·数据库·物联网·时序数据库·iotdb
是阿建吖!1 小时前
【Redis】初识Redis(定义、特征、使用场景)
数据库·redis·缓存
Leo.yuan1 小时前
数据处理工具是做什么的?常见数据处理方法介绍
大数据·数据库·人工智能·python·信息可视化
旧时光巷1 小时前
SQL基础⑫ | 视图篇
数据库·sql·学习·mysql·oracle·视图
阿里云大数据AI技术2 小时前
[VLDB 2025]面向云计算平台的多模态慢查询根因排序
大数据·数据库·人工智能
WJ.Polar2 小时前
Python与Mysql
开发语言·数据库·python·mysql