我正在尝试根据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个计数,因此无论“分钟”如何,它只会有效地对每个唯一的访问者进行计数
答案 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;