也许你们可以帮助我解决问题。我做了两个查询来跟踪每日唯一的操作数和每月唯一的操作数。但是,我现在想看看不同地区的这些数字,但我遇到了问题。我知道它会涉及一些我尚未完全包围的子查询。
关于我正在使用的内容,我正在使用Postgres进行查询,然后在pandas / python或R中进行查询。我非常有信心只需一个SQL查询就可以更快地完成。
我有一个类似于以下内容的事件表:
userid, date, event, item
1, 1/1/15 like A
2, 1/1/15 view A
3, 1/1/15 view B
2, 1/1/15 purchase A
1, 1/1/15 view B
要计算每日观看次数/每月观看次数,我目前执行以下操作:
daily_views = """
SELECT date(events.date) as daily_date, count(distinct events.userid) as daily_user
FROM
events
WHERE
date(events.date) between '2014-11-01' and '2015-01-31' AND
events.event LIKE '%%VIEW%%'
GROUP BY
date(events.date)"""
和每月
Monthly_Views = """
SELECT daily_date, daily_user, count(distinct events.userid) AS monthly_views
FROM
({daily_views})
LEFT OUT JOIN events ON events.date BETWEEN daily_date - INTERVAL '30 days' AND daily_date
WHERE events.event LIKE '%%LOGIN%%'
GROUP BY daily_date, daily_user
ORDER BY daily_date ASC""".format(daily_views=daily_views)
给我一张桌子:
date,daily_user,monthly_user
现在要包含感兴趣的区域,我有另一个名为users_data的表:
userid, country, ...
1, a
2, b
3, a
4, a
当我考虑这个问题时,我显然脑子已经死了,所以要包含语言,我首先在事件中加入users_data做了一个非常迂回的方式:
SELECT date(events.date), count(distinct events.userid) number_of_users, users_data.country
FROM events
JOIN users_data
ON
users_data.userid = events.userid
WHERE date(events.dateday) > '2014-11-20' and date(events.dateday) < '2014-11-22'
AND trackevents.event LIKE '%%%%VIEW%%%%'
GROUP BY
date(events.dateday), users_data.country
ORDER BY
date(events.date)
同样,我认为在一个月的范围内计算出来:
SELECT count(distinct events.userid) number_of_users, users_data.country
from events
JOIN users_data
ON
users_data.userid = events.userid
WHERE date(events.dateday) > '2014-10-01' and date(events.dateday) < '2014-11-01'
AND events.event LIKE '%%VIEW%%'
GROUP BY
users_data.country
然后,我必须对使用过的Pandas进行排序,以打印出特定感兴趣的国家。
虽然这让我得到了答案,但这是非常愚蠢和耗时的。我知道有更好的方法去那里,但我现在有点难过。基本上我想得到类似于第一个类似于指定语言或语言的东西:
date, daily, monthly, country
2014-11-01, 1239, 5123, US
2014-11-01, 439, 1123, CA
2014-11-02, 1439, 5653, US
2014-11-01, 402, 1224, CA
如果需要,我更喜欢SQL语句,但是Pandas。此外,如果你注意到,如果有一个很好的方式来做第一个日期。我现在还在学习SQL,并且稍微超出了我的速度。
提前感谢您的帮助!