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

相关推荐
麦聪聊数据19 分钟前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务20 分钟前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯2 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七2 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草2 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程2 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0802 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥3 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫3 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森3 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle