SQL:将结果集减少到X行?

SQL:将结果集减少到X行?,sql,aggregate,resultset,reduce,Sql,Aggregate,Resultset,Reduce,我有以下MYSQL表: measuredata: - ID (bigint) - timestamp - entityid - value (double) 该表包含超过10亿个条目。我希望能够可视化任何时间窗口。时间窗口的大小可以是“一天”到“多年”。大约每分钟都有测量值,单位为DB 因此,一个时间窗口的条目数量可能会有很大的不同。从几百到几千或几百万 这些值将在网页上的图形图表中可视化 如果图表的宽度是-让我们说-800px,那么如果时间窗口很大,从数据库中获取数千行是没有意义的。无论如何

我有以下MYSQL表:

measuredata:
- ID (bigint)
- timestamp
- entityid
- value (double)
该表包含超过10亿个条目。我希望能够可视化任何时间窗口。时间窗口的大小可以是“一天”到“多年”。大约每分钟都有测量值,单位为DB

因此,一个时间窗口的条目数量可能会有很大的不同。从几百到几千或几百万

这些值将在网页上的图形图表中可视化

如果图表的宽度是-让我们说-800px,那么如果时间窗口很大,从数据库中获取数千行是没有意义的。无论如何,我不能在这个图表上显示超过800个值

那么,有没有办法直接在DB端减少resultset? 我知道“平均”和“和”等是聚合函数。但是,我如何从一个大的时间窗口将10万行聚合到最后800行呢

仅仅获得那些10万行并让图表发挥神奇作用并不是首选选项。传输大小是这不是一个选项的原因之一

DB端没有我可以使用的东西吗? 像avg()这样的东西可以将X行压缩为Y行? 还是一个简单的魔术,跳过每一行,将X缩小到Y

更新: 虽然我现在使用的是MySQL,但我并不局限于此。如果PostgreSQL f.i.提供的功能可以解决这个问题,我愿意切换DB

更新2: 我可能找到了一个可能的解决方案: 请参阅“数据聚合”一节

关键不是使用unixtimestamp,而是使用日期和“trunc”标记,根据trunc’ed日期对值和组进行平均。可以为我工作,但需要对我的表结构进行返工。隐马尔可夫模型。。。也许还有更多。。。还在研究

更新3: 受更新2的启发,我提出了以下问题:

SELECT (`timestamp` - (`timestamp` % 86400)) as aggtimestamp, `entity`, `value`  FROM `measuredata` WHERE `entity` = 38 AND timestamp > UNIX_TIMESTAMP('2019-01-25') group by aggtimestamp

工作正常,但我的DB/index/structue似乎并没有为此进行真正的优化:去年的查询耗时约75秒(测试速度较慢),但最终每天只得到一个值。这可以与平均值(
)结合使用,但这会进一步增加查询时间。。。(~82秒)。我会看看是否有可能进一步优化这个。但我现在知道了“下采样”数据是如何工作的,特别是在聚合与“分组方式”相结合的情况下

可能没有有效的方法来做到这一点。但是,如果需要,可以将行分成大小相等的组,然后从每个组中提取(比如)第一行。这里有一种方法:

select md.*
from (select md.*,
             row_number() over (partition by tile order by timestamp) as seqnum
      from (select md.*, ntile(800) over (order by timestamp) as tile
            from measuredata md
            where . . .   -- your filtering conditions here
           ) md
     ) md
where seqnum = 1;

嗯,这是三重选择数据。这肯定会减少必须传输的数据,但我不确定查询工作量/数据库负载。。。我真的希望在我的研究中没有看到一些聚合函数。有人知道PostgreSQL会提供更多吗?@Alex。当你的问题显然是关于MySQL的时候,你为什么在评论中问Postgres?如果你有关于Postgres的问题,你应该把它作为一个问题来问。因为我不喜欢MySQL?所描述的数据库结构非常简单,实际使用的数据库系统应该无关紧要。这就是为什么。我将在问题中添加此细节…
width\u bucket()
在Postgres中出现: