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

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

我能做到这一点:

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

每隔150行看一下。

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

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

===============>>#1 票数: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;

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

===============>>#3 票数:1

我想到了这样的事情

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

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

===============>>#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

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

===============>>#6 票数:0

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

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

===============>>#7 票数:0

@Michal

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

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

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

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

  ask by Michiel de Mare translate from so

未解决问题?本站智能推荐: