我有一个包含以下列的表格:
sales_log_id | user_id | created_at
-------------|---------|------------
0001 | aaa | 2019-06-01
0002 | aaa | 2019-06-01
0003 | aaa | 2019-06-01
0004 | aaa | 2019-06-01
0005 | bbb | 2019-06-01
0006 | bbb | 2019-06-01
0007 | aaa | 2019-06-02
0008 | aaa | 2019-06-02
0009 | aaa | 2019-06-02
0010 | aaa | 2019-06-02
0011 | bbb | 2019-06-02
0012 | ccc | 2019-06-02
0013 | ccc | 2019-06-02
0014 | ccc | 2019-06-02
0015 | ccc | 2019-06-02
0016 | ddd | 2019-06-02
0017 | ddd | 2019-06-02
我正在寻找的输出是:
user_id | count
--------|------
aaa | 2
或简单
1
因为自 2019年6月1日至2019年6月2日开始之日起,只有aaa每天连续拥有> = 4个sales_log_id。
我需要依靠具有一天中有一段时间,连续连续完成4笔交易(用sales_log_id表示)-可以说上个月。
我已经能够统计每月仅进行== 4次交易的用户。
SELECT DISTINCT user_id, COUNT (user_id)
FROM sales_log
WHERE created_at BETWEEN '2019-06-01' AND '2019-06-30'
GROUP BY user_id
HAVING COUNT (sales_log_id) >= 4;
有人可以给我一个使用子查询执行此操作的示例吗?
答案 0 :(得分:1)
首先GROUP BY user_id, created_at
在一天内获得至少4次交易的用户,然后GROUP BY user_id
对结果进行设置,并在HAVING子句中设置条件:
SELECT t.user_id, COUNT(t.created_at) counter
FROM (
SELECT user_id, created_at
FROM sales_log
WHERE created_at BETWEEN '2019-06-01' AND '2019-06-02'
GROUP BY user_id, created_at
HAVING COUNT(sales_log_id) >= 4
) t
GROUP BY t.user_id
HAVING COUNT(t.created_at) = 1 + '2019-06-02'::date - '2019-06-01'::date
或:
SELECT count(distinct t.user_id) usercounter
FROM (
SELECT user_id, created_at
FROM sales_log
WHERE created_at BETWEEN '2019-06-01' AND '2019-06-02'
GROUP BY user_id, created_at
HAVING COUNT(sales_log_id) >= 4
) t
GROUP BY t.user_id
HAVING COUNT(t.created_at) = 1 + '2019-06-02'::date - '2019-06-01'::date
请参见demo。
结果:
> user_id | counter
> :------ | ------:
> aaa | 2
和
> | usercounter |
> | ----------: |
> | 1 |