首页 > 解决方案 > 如何在 SQL 中返回具有特定分辨率(均匀分布)的数据集的记录

问题描述

我面对一个包含大量条目(约 1900 万)的数据库。在我的服务器上查询大约需要 20 秒并返回很多结果。但在前端(图表)中,我不需要每一行,所以我的想法是只返回结果行的 100 个元素。但不是前 100 个或后 100 个:这些行的 100 个均匀分布的元素。换句话说,我希望能够指定我的数据的分辨率。

这是一些伪代码。

SELECT time, type, value
FROM [table_name]
WHERE time >= [start_date] AND
      time <= [end_date] AND
      type = [any_type]
LIMIT 100 UNIFORMLY DISTRIBUTED OVER RESULTS;

您对如何为此编写查询有任何想法吗?这甚至可能吗?

标签: mysqlsql

解决方案


您可以按如下方式使用分析函数计数和行数(请根据您的数据库使用函数和语法):

Select * from
(SELECT time, type, value,
       Row_number(1) over (order by time) as rn,
       Count(1) over() as cnt
FROM [table_name]
WHERE time >= [start_date] AND
      time <= [end_date] AND
      type = [any_type]) t
Where mod(rn,trunc(cnt/100)) = 0
Order by time limit 100

推荐阅读