Postgres:如何在一定时间内连续计算条件记录?

时间:2019-07-15 09:11:34

标签: sql postgresql subquery

我有一个包含以下列的表格:

  • (PK)sales_log_id
  • user_id
  • created_at
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;

有人可以给我一个使用子查询执行此操作的示例吗?

1 个答案:

答案 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 |