【问题标题】:How to select 1000 customers who were the first to gain 1000 bonus points for purchases in categories "Taxi" and "Books"? (SQLite)如何在“出租车”和“图书”类别中选择第一个获得 1000 积分的 1000 位顾客? (SQLite)
【发布时间】:2021-02-28 13:10:09
【问题描述】:

BONUS 表有属性:client_id、bonus_date、累积红利数量(bonus_cnt)、添加红利的交易的mcc 代码(mcc_code)。 MCC_CATEGORIES 表是一个 mcc 代码参考。 属性: mcc-code(mcc_code),类别(例如,超市、交通、药店等,mcc_category)

如何选择 1000 位最先获得 1000 积分购买的顾客 类别“出租车”和“书籍”?

BONUS 表如下所示:

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
...

【问题讨论】:

  • 你的意思是在每个类别中分开吗?在任一类别中?还是将这两个类别结合起来?

标签: sql sqlite sum inner-join where-clause


【解决方案1】:

我会使用窗口函数和聚合:首先加入表格并计算每个用户和类别的奖金的运行总和。然后按用户和类别聚合,得到他们达到奖金 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 版本开始提供窗口函数。

【讨论】:

  • 欢迎@wqef。如果我的回答正确地回答了您的问题,请点击复选标志accept it...谢谢。
【解决方案2】:

如何选择在“出租车”和“图书”类别中最先获得 1000 积分的 1000 位顾客?

我猜您想将这两个类别的奖金组合在一起。如果是这样:

select client_id, min(bonus_date) as min_bonus_date
from (select b.client_id, b.bonus_date, b.bonus_cnt,
             sum(b.bonus_cnt) over (partition by b.client_id order by b.bonus_date) as running_bonus_cnt
      from bonus b join
           mcc_categories c
           on c.mcc_code = b.mcc_code
      where mcc_category in ('Taxi', 'Books')
     ) bc
 where running_bonus_cnt >= 1000 and
       running_bonus_cnt - bonus_cnt < 1000
group by client_id
order by min_bonus_date
limit 1000;

注意这是如何工作的。子查询计算运行奖金金额。然后where 子句获取奖金计数首次超过 1000 的那一行。

剩下的只是聚合。

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多