我有一个 MySQL 表,每个用户大约有 3000 行。其中一列是日期时间字段,它是可变的,因此行不按时间顺序排列。

我想在图表中可视化时间分布,因此我需要许多单独的数据点。20 个数据点就足够了。

我可以这样做:

select timefield from entries where uid = ? order by timefield;

并查看每 150 行。

或者我可以做 20 个单独的查询并使用 limit 1offset.

但必须有一个更有效的解决方案......

有帮助吗?

解决方案

Michal Sznajder 几乎做到了,但是您不能在 SQL 的 WHERE 子句中使用列别名。所以你必须将它包装为派生表。我尝试了这个,它返回 20 行:

SELECT * FROM (
    SELECT @rownum:=@rownum+1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;

其他提示

我想到了这样的事情

select @rownum:=@rownum+1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0

我手头没有 MySQL,但这也许会有所帮助......

就可视化而言,我知道这不是您所说的定期采样,但我会查看用户的所有行并选择一个间隔桶,在桶内求和并显示在条形图或类似的图表上。这将显示真实的“分布”,因为一段时间内发生的许多事件可能都很重要。

SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket -- choose an appropriate granularity (days used here)
     ,COUNT(*)
FROM entries
WHERE uid = ?
GROUP BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)
ORDER BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)

或者,如果您不喜欢必须重复自己的方式 - 或者如果您正在使用不同的存储桶并希望以 3-D 方式分析许多用户(根据 x、y uid、存储桶在 Z 中进行测量):

SELECT uid
    ,bucket
    ,COUNT(*) AS measure
FROM (
    SELECT uid
        ,DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket
    FROM entries
) AS buckets
GROUP BY uid
    ,bucket
ORDER BY uid
    ,bucket

如果我想以 3D 方式绘制,我可能会根据对用户有意义的总体指标来确定一种对用户进行排序的方法。

@米哈尔

无论出于何种原因,您的示例仅在 where @recnum 使用小于运算符时才有效。我认为当 where 过滤掉一行时, rownum 不会增加,并且它不能匹配其他任何内容。

如果原始表有一个自动递增的 id 列,并且行是按时间顺序插入的,那么这应该可以工作:

select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;

当然,如果 id 和时间字段之间没有相关性,那么这不起作用,除非您实际上并不关心获得均匀间隔的时间字段,而只是 20 个随机时间字段。

您真的关心各个数据点吗?或者使用天数上的统计聚合函数足以告诉您您想知道的信息吗?

select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

不是 mysql 专家,所以我不确定 rand() 在这种环境中如何运行。

供我参考 - 以及对于那些使用 postgres 的人 - Postgres 9.4 将具有应该解决此问题的有序集合聚合:

SELECT percentile_disc(0.95) 
WITHIN GROUP (ORDER BY response_time) 
FROM pageviews;

来源: http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top