我不熟悉在Postgres中编写查询,并且有兴趣了解如何计算每天唯一首次使用的用户数。
如果表只有两列 - user_id
和start_time
,这是一个指示使用时间的时间戳。如果用户在前一天使用过,则不应计算user_id
。
为什么以下查询不起作用?难道不可能一次选择两个变量上的不同吗?
SELECT COUNT (DISTINCT min(start_time::date), user_id),
start_time::date as date
FROM mytable
GROUP BY date
生成
错误:函数计数(日期,整数)不存在
输出看起来像这样
date count
1 2017-11-22 56
2 2017-11-23 73
3 2017-11-24 13
4 2017-11-25 91
5 2017-11-26 107
6 2017-11-27 33...
有关如何计算不同的最小日期和user_id以及然后在psql中按日期分组的任何建议将不胜感激。
答案 0 :(得分:1)
试试这个
select start_time,count(*) as count from
(
select user_id,min(start_time::date) as start_time
from mytable
group by user_id
)distinctRecords
group by start_time;
这将为每个用户仅计算一次最小日期。
答案 1 :(得分:1)
你可以试试这个逻辑:
user_id
的首次登录时间 - MIN
(start_time)
。COUNT
的参数为NULL
时,CREATE TABLE yourtable
(user_id int, start_time varchar(19))
;
INSERT INTO yourtable
(user_id, start_time)
VALUES
(1, '2018-03-19 08:05:01'),
(2, '2018-03-19 08:05:01'),
(1, '2018-03-19 08:05:04'),
(3, '2018-03-19 08:05:01'),
(1, '2018-03-20 08:05:04'),
(2, '2018-03-20 08:05:04'),
(4, '2018-03-20 08:05:04'),
(3, '2018-03-20 08:05:06'),
(3, '2018-03-20 08:05:04'),
(3, '2018-03-20 08:05:05'),
(1, '2018-03-21 08:05:06'),
(3, '2018-03-21 08:05:05'),
(6, '2018-03-21 08:05:06'),
(3, '2018-03-22 08:05:05'),
(4, '2018-03-22 08:05:05'),
(5, '2018-03-23 08:05:05')
;
不会在记录中添加1。PostgreSQL 9.6架构设置:
WITH f
AS ( SELECT user_id, MIN (start_time) first_start_time
FROM yourtable
GROUP BY user_id)
SELECT t.start_time::DATE
,count( CASE WHEN t.start_time > f.first_start_time
THEN NULL ELSE 1 END )
FROM yourtable t JOIN f ON t.user_id = f.user_id
GROUP BY start_time::DATE
ORDER BY 1
查询1 :
| start_time | count |
|------------|-------|
| 2018-03-19 | 3 |
| 2018-03-20 | 1 |
| 2018-03-21 | 1 |
| 2018-03-22 | 0 |
| 2018-03-23 | 1 |
<强> Results 强>:
Cannot open include file: 'boost/python/detail/prefix.hpp': No such file or directory
答案 2 :(得分:0)
您可以使用以下查询:
select count(user_id ) total_user , start_time
from (
SELECT min (date (start_time)) start_time, user_id
FROM mytable )tmp
group by start_time