sql - 如何在“出租车”和“图书”类别中选择第一个获得 1000 积分的 1000 位顾客?(SQLite)
问题描述
BONUS表有属性:client_id、bonus_date、累积奖金的数量(bonus_cnt)、添加奖金的交易的mcc代码(mcc_code)。MCC_CATEGORIES 表是一个 mcc 代码参考。属性:mcc-code(mcc_code),类别(例如,超市,运输,药店等,mcc_category)
如何在“出租车”和“图书”类别中选择第一个获得 1000 积分的 1000 位顾客?
奖金表如下所示:
CLIENT_ID BONUS_DATE BONUS_CNT MCC_CODE
1121 2020-01-02 23 5432
3421 2020-04-15 7 654
...
MCC_CATEGORIES 表如下所示:
MCC_CODE MCC_CATEGORY
5432 Taxi
3532 Music
...
解决方案
我会使用窗口函数和聚合:首先加入表格并计算每个用户和类别的奖金的运行总和。然后按用户和类别聚合,得到他们达到奖金 1000 的日期。最后,计算每个用户在两个类别上达到目标的日期,按此排序,并限制:
select client_id, max(bonus_date) bonus_date
from (
select client_id, mcc_category, min(bonus_date) bonus_date
from (
select b.client_id, b.bonus_date, c.mcc_category,
sum(bonus_cnt) over(partition by b.client_id, c.mcc_category order by b.bonus_date) sum_bonus
from bonus b
inner join mcc_categories c on c.mcc_code = b.mcc_code
where mcc_category in ('Taxi', 'Books')
) t
where sum_bonus >= 1000
group by client_id, mcc_category
) t
group by client_id
having count(*) = 2
order by bonus_date
limit 1000
SQLite 从 3.25 版开始提供窗口函数。
推荐阅读
- r - 如何选择出现在多个组中的个人?
- jenkins - 无法从浏览器访问詹金斯
- c# - 如何根据 XAML 中的 Binding 和 Property 设置多个条件?
- html - 如何证明 flex 容器中的空 div 是合理的
- javascript - 函数调用如何解决promise?
- mysql - 应用程序抛出找不到模块 babel-preset-es2015
- c# - 如何包含用 ASP.NET 编写的 API 的起始页?
- amazon-web-services - 选项卡和过滤器从移动设备上的嵌入式快速查看仪表板中消失
- reactjs - 在 Reducer 中未定义数组数据的初始状态
- javascript - Webpack 导入,default.a 不是构造函数