2

我有一个用于绘图和数据检查的大型数据库。为简单起见,假设它看起来像这样:

|    id    |    day    |    obs    |
+----------+-----------+-----------+
|    1     |    500    |    4.5    | 
|    2     |    500    |    4.4    | 
|    3     |    500    |    4.7    | 
|    4     |    500    |    4.8    | 
|    5     |    600    |    5.1    | 
|    6     |    600    |    5.2    | 
                ...

这可能是股票市场数据,我们每天有很多点可以测量。

我想要做的是查看更长的趋势,每天的多个点被不必要地解决,并阻塞我的绘图应用程序。(我想看 30000 天,每个都有大约 100 个观察值)。

有没有办法做类似的事情SELECT ... LIMIT 1 PER "day"

我想我可以执行一些SELECT DISTINCT查询来找到正确的 ID,但如果它是内置的,我宁愿做一些简单的事情。

它是每天的第一个、最后一个还是平均值都没有关系。只是一个值。我只喜欢最快的。

另外,我想为 Postgres、MySQL 和 SQLite 执行此操作。我的应用程序是为使用所有这三个而构建的,我经常在它们之间切换。

谢谢!

背景:这是针对 Ruby on Rails 绘图应用程序的,因此使用 ActiveRecord 的技巧也可以。https://github.com/ZachDischner/Rails-Plotter

4

2 回答 2

3

您需要使用您正在使用的 RDBMS 品牌来标记您的问题。Rails 开发人员经常使用 MySQL,但您的问题的答案取决于此。

对于除 MySQL 之外的所有品牌,正确和标准的解决方案是使用窗口函数

SELECT * FROM (
  SELECT ROW_NUMBER() OVER (PARTITION BY day) AS RN, *
  FROM stockmarketdata
) AS t
WHERE t.RN = 1;

对于尚不支持窗口函数的 MySQL,您可以使用会话变量以一种笨拙的方式模拟它们:

SELECT * FROM (SELECT @day:=0, @r:=0) AS _init,
(
  SELECT IF(day=@day, @r:=@r+1, @r:=0) AS RN, @day:=day AS d, *
  FROM stockmarketdata
) AS t
WHERE t.RN = 1
于 2013-02-15T16:39:26.187 回答
1

你的陈述留下了很大的选择空间:

它是每天的第一个、最后一个还是平均值都没有关系。只是一个值。我只喜欢最快的。

因此,我将把 id 排除在外,并首先建议将每个组的 obs 平均值作为最简单且可能最实用的方法,尽管可能不是运行 stat 函数与 limit 的最快速度:

MyModel.group(:day).average(:obs)

如果你想要最低限度:

MyModel.group(:day).minimum(:obs)

如果你想要最大值:

MyModel.group(:day).maximum(:obs)

(注意:以下 2 个示例比仅输入 SQL 效率低,但可能更便携。)

但你可能想要所有三个:

ActiveRecord::Base.connection.execute(MyModel.select('MIN(obs), AVG(obs), MAX(obs)').group(:day).to_sql).to_a

或者只是没有哈希的数据:

ActiveRecord::Base.connection.exec_query(MyModel.select('MIN(obs), AVG(obs), MAX(obs)').group(:day).to_sql)

如果您想要中位数,请参阅这个更具体的 DB 问题,如果您搜索 ,还有其他相关帖子。

更重要的是,像 postgres 这样的一些 DB 具有内置的variance(...),stddev(...)等。

最后,查看Rails 指南和ARel中的查询部分,了解有关构建查询的更多信息。例如,您可以通过或在 ActiveRecord 关系中进行限制,而在 ARel 中,您可以进行限制。子查询也是可能的,如对该问题的回答所示,group by 等也是如此。如果您与其他人共享此项目,请尝试限制您正在使用的不可移植 SQL 的数量,除非您计划添加对您自己的其他数据库并维护它。firstlimittake

于 2013-02-15T17:46:04.880 回答