Postgresql 有多少用户在n天的时间段内有2个或更多事务,甚至一天都没有跳过
我需要帮助从“sales_track”表中查找和统计至少有两个或更多交易的用户在特定连续时间段内的订单。请重新表述:有多少用户在n天内有两个或更多交易,甚至一天都没有跳过 销售跟踪Postgresql 有多少用户在n天的时间段内有2个或更多事务,甚至一天都没有跳过,postgresql,Postgresql,我需要帮助从“sales_track”表中查找和统计至少有两个或更多交易的用户在特定连续时间段内的订单。请重新表述:有多少用户在n天内有两个或更多交易,甚至一天都没有跳过 销售跟踪 sales_tx_id | u_id | create_date | item_id | price ------------|------|-------------|---------|--------- ffff-0291 | 0001 | 2019-08-01 | 0300 | 5.00 fff
sales_tx_id | u_id | create_date | item_id | price
------------|------|-------------|---------|---------
ffff-0291 | 0001 | 2019-08-01 | 0300 | 5.00
ffff-0292 | 0001 | 2019-08-01 | 0301 | 2.50
ffff-0293 | 0002 | 2019-08-01 | 0209 | 3.50
ffff-0294 | 0003 | 2019-08-01 | 0020 | 1.00
ffff-0295 | 0001 | 2019-08-02 | 0301 | 2.50
ffff-0296 | 0001 | 2019-08-02 | 0300 | 5.00
ffff-0297 | 0001 | 2019-08-02 | 0209 | 3.50
ffff-0298 | 0002 | 2019-08-02 | 0300 | 5.00
为了简单起见,样本是连续两天的,时间段仅在2019-08-01和2019-08-02之间,在实际操作中,我必须搜索,例如连续10天的交易
到目前为止,我能够找到至少两个或更多的交易
SELECT user_id, COUNT (user_id) FROM sales_track WHERE created_at BETWEEN
('2019-08-01') AND ('2019-08-02')
GROUP BY u_id HAVING COUNT (sales_tx_id) >= 2;
我想要的输出是:
u_id | tx_count | tx_amount
------|----------|------------
0001 | 5 | 18.50
提前谢谢你的帮助
第一:我的扩展数据集:
sales_tx_id | user_id | created_at | item_id | price
:---------- | :------ | :--------- | :------ | ----:
ffff-0291 | 0001 | 2019-08-01 | 0300 | 5.00
ffff-0292 | 0001 | 2019-08-01 | 0301 | 2.50
ffff-0293 | 0002 | 2019-08-01 | 0209 | 3.50
ffff-0294 | 0003 | 2019-08-01 | 0020 | 1.00
ffff-0295 | 0001 | 2019-08-02 | 0301 | 2.50
ffff-0296 | 0001 | 2019-08-02 | 0300 | 5.00
ffff-0297 | 0001 | 2019-08-02 | 0209 | 3.50
ffff-0298 | 0002 | 2019-08-02 | 0300 | 5.00
ffff-0299 | 0001 | 2019-08-05 | 0209 | 3.50
ffff-0300 | 0001 | 2019-08-05 | 0020 | 1.00
ffff-0301 | 0001 | 2019-08-06 | 0209 | 3.50
ffff-0302 | 0001 | 2019-08-06 | 0020 | 1.00
ffff-0303 | 0001 | 2019-08-07 | 0209 | 3.50
ffff-0304 | 0001 | 2019-08-07 | 0020 | 1.00
ffff-0305 | 0002 | 2019-08-08 | 0300 | 5.00
ffff-0306 | 0002 | 2019-08-08 | 0301 | 2.50
ffff-0307 | 0001 | 2019-08-09 | 0209 | 3.50
ffff-0308 | 0001 | 2019-08-09 | 0020 | 1.00
ffff-0309 | 0002 | 2019-08-09 | 0300 | 5.00
ffff-0310 | 0002 | 2019-08-09 | 0301 | 2.50
ffff-0311 | 0001 | 2019-08-10 | 0209 | 3.50
ffff-0312 | 0001 | 2019-08-10 | 0020 | 1.00
ffff-0313 | 0002 | 2019-08-10 | 0300 | 5.00
用户1有3条条纹:
2019-08-01, 2019-08-02
2019-08-05, 2019-08-06, 2019-08-07
2019-08-09, 2019-08-10
用户2:
在2019-08-01、2019-08-02有交易记录,但每个日期只有一笔,因此不计算在内
在2019-08-08、2019-08-09、2019-08-10上有连胜,只有一笔交易,不延长连胜
因此,我们期望有4行:每个用户3行1条,用户2 1条
SELECT -- 4
user_id,
SUM(count),
SUM(price),
MIN(created_at) AS consecutive_start
FROM (
SELECT *, -- 3
SUM(is_in_same_group) OVER (PARTITION BY user_id ORDER BY created_at) AS group_id
FROM (
SELECT -- 2
*,
(lag(created_at, 1, created_at) OVER (PARTITION BY user_id ORDER BY created_at) + 1 <> created_at)::int as is_in_same_group
FROM (
SELECT -- 1
created_at,
user_id,
COUNT(*),
SUM(price) AS price
FROM
sales_track
WHERE created_at BETWEEN '2018-02-01' AND '2019-08-11'
GROUP BY created_at, user_id
HAVING COUNT(*) >= 2
) s
) s
) s
GROUP BY user_id, group_id
将所有创建的用户id组分组,并删除计数小于2的组
允许获取一个有序组中的上一条记录的值。这里的组是用户id。这里的检查是:如果当前创建的值是前一个当前值+1的旁边,则为0,否则为1。
现在,我们可以使用累积求和窗口函数对这些值进行求和:如果差值太大,则该值会增加,如果值为1,则该值与上一个日期的值相同。现在我们得到了一个组id,用于所有只相差+1的日期
最后,这些组可以分组求和和和计数
有什么问题?只要加上价格。顺便说一句:在您的示例中,2也是一个解决方案:2个条目;否则:您使用的连续版本是什么意思?问题是连续n天部分。例如,需要找到在10天内至少有两个或更多事务且不跳过一天的用户。我正在使用postgres PostgreSQL 11.3,pgAdmin 4.0再次感谢您一如既往的快速响应!不过,我已尽最大努力更新了问题,以避免误解。这是连续几天的部分,这是非常困难的。有多少用户在n天内有2个或多个事务,甚至一天都没有跳过。@Worka Ok,但为什么用户2不在预期输出中?用户2不在预期输出中,因为在请求期间每天只有1个事务。@Worka Hm,他在2019-08-1和2019-08-02分别有1个和1个用户2需要在连续n天内每天至少有2个或更多交易。这种情况下为2天,可能为10天、30天等