我有来自网站的流量日志。
我想从10%的用户群中抽取流量。 但是数据库中的每个记录都是一次访问,并且每个客户可以进行多次访问。仅获得10%的流量是不正确的,因为20%的用户可能会产生80%的流量。
表结构很简单
user_id, page
如何在没有太多嵌套子查询的情况下从随机10%的客户那里获得流量?
答案 0 :(得分:1)
如果使用MySQL,则可以尝试:
/* Calculate 10% of the users, rounding up to account for values below 1 */
SET @limit = CEIL((SELECT COUNT(DISTINCT(user_id)) FROM TRAFFIC) / 10);
/* Prepare a statement for getting the traffic */
PREPARE STMT FROM 'SELECT *
FROM TRAFFIC T
INNER JOIN (
SELECT DISTINCT(user_id)
FROM TRAFFIC
LIMIT ?
) U
ON T.user_id = U.user_id';
/* Execute the statement using the pre-computed limit. */
EXECUTE STMT USING @limit;
这是PostgreSQL中的类似实现(基于反馈):
SELECT *
FROM TRAFFIC T
INNER JOIN (
SELECT DISTINCT user_id
FROM TRAFFIC
LIMIT CEIL((SELECT COUNT(DISTINCT user_id) FROM TRAFFIC) / 10)
) U
ON T.user_id = U.user_id;
答案 1 :(得分:1)
如果您的用户存储在其他表中(并且日志表的user_id
是该表的外键),则可以使用tablesample
选项在一个子表中获取10%的用户。选择:
select *
from the_table
where user_id in (select id
from users
tablesample system (10));
如果没有这样的表,Jake的查询(没有准备好的语句)可能是解决方法。