12

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

我想在图表中可视化时间分布,所以我需要一些单独的数据点。20 个数据点就足够了。

我可以这样做:

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

并查看每 150 行。

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

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

4

7 回答 7

6

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;
于 2008-10-01T01:49:27.897 回答
1

我想到了这样的事情

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

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

于 2008-08-06T17:06:44.247 回答
1

就可视化而言,我知道这不是您正在谈论的定期采样,但我会查看用户的所有行并选择一个间隔桶,桶内的 SUM 并显示在条形图或类似物中。这将显示一个真正的“分布”,因为在一个时间范围内的许多事件可能很重要。

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 中分析许多用户(在 Z 中测量 x、y uid、存储桶):

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

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

于 2008-10-01T02:07:33.347 回答
0

@迈克尔

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

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

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

当然,如果 id 和 timefield 之间没有相关性,那是行不通的,除非您实际上并不关心获得均匀间隔的 timefields,只关心 20 个随机 timefields。

于 2008-08-06T18:01:32.733 回答
0

您真的关心各个数据点吗?或者使用日期数的统计聚合函数就足以告诉您您想知道什么?

于 2008-08-27T16:14:36.443 回答
0
select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

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

于 2008-08-27T16:37:10.760 回答
0

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

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

资料来源:http ://www.craigkerstiens.com/2014/02/02/Examineing-PostgreSQL-9.4/

于 2014-02-27T11:36:00.383 回答