如何获得10%的用户创建的所有记录?

时间:2019-06-18 22:35:25

标签: postgresql

我有来自网站的流量日志。

我想从10%的用户群中抽取流量。 但是数据库中的每个记录都是一次访问,并且每个客户可以进行多次访问。仅获得10%的流量是不正确的,因为20%的用户可能会产生80%的流量。

表结构很简单

user_id, page

如何在没有太多嵌套子查询的情况下从随机10%的客户那里获得流量?

2 个答案:

答案 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的查询(没有准备好的语句)可能是解决方法。