Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何获取10%用户创建的所有记录?_Postgresql - Fatal编程技术网

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

Postgresql 如何获取10%用户创建的所有记录?,postgresql,Postgresql,我有我网站的流量日志 我想从10%的用户群中取样流量。 但数据库中的每个记录都是一次访问,每个客户都可以有多次访问。只获得10%的流量是不正确的,因为20%的用户可能产生80%的流量 表结构简单 user_id, page 如何在没有太多嵌套子查询的情况下从随机10%的客户获得流量?如果使用MySQL,您可以尝试: /* Calculate 10% of the users, rounding up to account for values below 1 */ SET @limit = C

我有我网站的流量日志

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

表结构简单

user_id, page

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

如果使用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;

如果使用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;

如果您的用户存储在不同的表中,并且日志表的用户id是外键,则您可以使用tablesample选项在子选择中获取10%的用户:

挑选* 从桌子上 在“选择id”中的“用户id”位置 来自用户 表采样系统10;
如果您没有这样一个表,Jake的查询没有准备好的语句可能是一种方法。

如果您的用户存储在不同的表中,并且日志表的用户id是一个外键,您可以使用tablesample选项在子选择中获取10%的用户:

挑选* 从桌子上 在“选择id”中的“用户id”位置 来自用户 表采样系统10;
如果您没有这样一个表,Jake在没有准备好的语句的情况下的查询可能是最好的方法。

您有另一个存储所有用户的表吗?您有另一个存储所有用户的表吗?很高兴知道。我根据你的反馈更新了我的答案。@JakeHolzinger:我认为你可以删除你的MySQL解决方案,因为这个问题只标有postgresqlGood to know。我根据你的反馈更新了我的答案。@JakeHolzinger:我认为你可以删除你的MySQL解决方案,因为这个问题只有postgresql标记