不同的列选择并按多列分组

时间:2019-10-19 19:16:38

标签: sql postgresql

我正在尝试根据visitor_id上的page_views分组以计算“访问者”而不是“页面浏览量”。

我的架构由

组成
id
visitor_id
country_code
created_at

以下查询类型有效,但是如果同一minute中有多个记录,则该分钟的计数将大于1,但该visitor_id将不存在其他分钟

select DISTINCT ON (visitor_id) 
         FLOOR(EXTRACT(epoch from created_at) / 60) 
       - FLOOR(extract(epoch from now() at time zone 'utc') / 60) 
       as minutes, 
       count(DISTINCT visitor_id) as count 
from page_views 
group by visitor_id, minutes;

更新: 这是一些示例数据和预期结果

+----+------------+-------------+
| id | visitor_id | created_at  |
+----+------------+-------------+
|  1 |          1 | 1571520145  |
|  2 |          1 |  1571520085 |
|  3 |          3 |  1571520085 |
+----+------------+-------------+

这基本上将为每个不同的分钟返回1个计数,因此无论“分钟”如何,它只会有效地对每个唯一的访问者进行计数

2 个答案:

答案 0 :(得分:0)

  

我正在尝试按page_views表上的visitor_id分组以计算“访客”

如果您要按访问者分组,则 import glob import pandas as pd mylist = [f for f in glob.glob("*.csv")] df = pd.read_csv(csvList[0]) #create the dataframe from the first csv df = pd.DataFrame(df.iloc[:,0]) #only keep 2nd column for x in mylist[1:]: #loop through the rest of the csv files doing the same t = pd.read_csv(x) colName = pd.DataFrame(t.iloc[:,0]).columns df[colName] = pd.DataFrame(t.iloc[:,0]) df.to_csv('output.csv', index=False) 是您想要的。然后,问题就变成了您为每个访客计算的数量。如果您要计算每个访问者出现在数据中的次数,GROUP BY visitor_id会这样做。 count(*)是不必要的;我们已经按访问者分组。

您似乎也想了解每位访客的分钟数。无论是什么,它都是某种聚合,也许是count(distinct visitor_id)。如果是这样,您的查询可以简化为以下形式的标准SQL:

sum()

select visitor_id, sum( FLOOR(EXTRACT(epoch from created_at) / 60) - FLOOR(extract(epoch from now() at time zone 'utc') / 60) ) as minutes, count(*) as count from page_views group by visitor_id 的一般规则是SELECT中不在GROUP BY中的所有内容都必须是聚合。另一种考虑方式是,选择项中未分组的任何内容都是该组的值的函数。

答案 1 :(得分:0)

  

我正在尝试按page_views表上的visitor_id分组以计算“访问者”而不是“页面浏览量”。

我将这解释为在特定时间段内需要唯一身份访问者。这并不是说的那样,但是与查询更加一致。

如果是,则visitor_id不属于GROUP BY

select (FLOOR(EXTRACT(epoch from created_at) / 60) -
        FLOOR(extract(epoch from now() at time zone 'utc') / 60) 
       ) as minutes, 
       count(DISTINCT visitor_id) as count 
from page_views 
group by minutes
order by minutes;

如果您只想计算某人首次访问的次数,请使用子查询:

select (FLOOR(EXTRACT(epoch from created_at) / 60) -
        FLOOR(extract(epoch from now() at time zone 'utc') / 60) 
       ) as minutes, 
       count(DISTINCT visitor_id) as count 
from (select visitor_id, min(created_at as created_at
      from page_views 
      group by visitor_id
     ) v
group by minutes
order by minutes;