MySQL查询:不使用HAVING找出2022年至少捐款两次的捐赠者
解决方案:不使用HAVING子句找出2022年捐款≥2次的捐赠者
原表结构与数据
| donorId | amount | year |
|---|---|---|
| 787 | 9.5 | 2022 |
| 567 | 7.9 | 2021 |
| 787 | 30 | 2022 |
| 456 | 2.5 | 2022 |
| 567 | 26 | 2022 |
| 456 | 26 | 2022 |
方法1:子查询统计捐赠次数
先通过子查询统计2022年每个捐赠者的捐款次数,再在外层筛选次数达标的记录:
SELECT donorId FROM ( SELECT donorId, COUNT(*) AS donation_count FROM your_table_name WHERE year = 2022 GROUP BY donorId ) AS donor_counts WHERE donation_count >= 2;
- 内层子查询仅处理2022年数据,按
donorId分组后统计每组的捐款次数; - 外层直接通过
WHERE筛选次数≥2的捐赠者,完全避开HAVING子句。
方法2:窗口函数标记重复记录
利用窗口函数计算每个捐赠者的总捐款次数,再筛选符合条件的记录并去重:
SELECT DISTINCT donorId FROM ( SELECT donorId, COUNT(*) OVER(PARTITION BY donorId) AS total_donations FROM your_table_name WHERE year = 2022 ) AS donor_donations WHERE total_donations >= 2;
或者用行号窗口函数实现:
SELECT DISTINCT donorId FROM ( SELECT donorId, ROW_NUMBER() OVER(PARTITION BY donorId ORDER BY amount) AS row_num FROM your_table_name WHERE year = 2022 ) AS donor_rows WHERE row_num >= 2;
- 窗口函数会为每条2022年的捐赠记录,计算出对应捐赠者的总捐款次数/行号;
- 外层筛选后用
DISTINCT去重,得到唯一的达标捐赠者ID。
内容的提问来源于stack exchange,提问作者Treadstone
相关产品推荐
相关产品推荐

