表及时分配

时间:2008-08-06 16:58:34

标签: sql mysql

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

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

我可以这样做:

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

并查看每第150行。

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

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

7 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分: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,bucket进行测量):

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中绘图,我可能会根据用户的一些有意义的整体指标来确定订购用户的方法。

答案 2 :(得分:1)

我想到了这样的事情

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

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

答案 3 :(得分:0)

您真的关心个别数据点吗?或者在日期编号上使用统计汇总函数而不是足以告诉您您想知道什么?

答案 4 :(得分: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/Examining-PostgreSQL-9.4/

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

@Michal

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

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

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

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