Postgres每天的第一次用户

时间:2018-03-19 03:46:35

标签: sql postgresql

我不熟悉在Postgres中编写查询,并且有兴趣了解如何计算每天唯一首次使用的用户数

如果表只有两列 - user_idstart_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中按日期分组的任何建议将不胜感激。

3 个答案:

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

SQL Fiddle

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