SQL查询实现NETWORK表按年月统计所有交易Value均≤50的唯一Card数量
需求背景
现有数据库表NETWORK,包含3个字段:
Card:交易银行卡号Date:交易日期,日期类型Value:单笔交易金额
统计规则
按年份、月份分组统计符合条件的去重卡号数量,规则如下:
- 仅当某张卡在对应月份的所有交易金额均≤50时,该卡计入当月统计
- 若某张卡在对应月份存在任意一笔交易金额>50,该卡不计入当月统计
实现思路
核心判断逻辑:对单卡单月的所有交易,只要最大交易金额≤50,即可证明该卡当月所有交易都符合要求,反之则不符合。
通过两层分组实现:
- 内层先按「卡号+年份+月份」分组,过滤出符合条件的卡号
- 外层再按「年份+月份」分组,统计符合条件的卡号数量即可
通用SQL实现(兼容多数主流数据库)
SELECT stat_year AS 统计年份, stat_month AS 统计月份, COUNT(Card) AS 符合条件卡号数 FROM ( SELECT Card, EXTRACT(YEAR FROM Date) AS stat_year, EXTRACT(MONTH FROM Date) AS stat_month FROM NETWORK GROUP BY Card, stat_year, stat_month HAVING MAX(Value) <= 50 ) valid_card_month GROUP BY stat_year, stat_month ORDER BY stat_year, stat_month;
不同数据库适配说明
- MySQL/SQL Server环境可将日期函数替换为
YEAR(Date)、MONTH(Date),写法更简洁 - Oracle环境也可使用
TO_CHAR(Date, 'yyyy')、TO_CHAR(Date, 'mm')获取年月
样例数据运行结果
针对提供的样例数据,运行上述SQL后输出结果如下:
| 统计年份 | 统计月份 | 符合条件卡号数 |
|---|---|---|
| 2020 | 1 | 2 |
| 2020 | 2 | 1 |
| 2021 | 3 | 1 |
内容的提问来源于stack exchange,提问作者Israr Khan
相关产品推荐
相关产品推荐

