在Rails中仅在一段时间内每小时返回一条记录

时间:2014-04-14 04:43:28

标签: ruby-on-rails ruby-on-rails-4

我编写了一个Rails 4应用程序,它接受并绘制传感器数据。有时每小时有10个点(但这个数字不固定)。我正在绘制数据并对Points.all进行简单查询以获取所有数据点。

为了减少查询大小,我想每小时只返回一条记录。返回哪条记录无关紧要。使用created_at字段每小时的第一条记录就可以了。

如何构建查询来执行此操作?

2 个答案:

答案 0 :(得分:1)

你可以得到第一个,但平均值可能更好。您需要做的就是按小时分组。我不是100%关于sqlite语法,但在这个意义上的东西:

connection.execute("SELECT AVG(READING_VALUE) FROM POINTS GROUP BY STRFTIME('%Y%m%d%H0', CREATED_AT)")

答案 1 :(得分:0)

受到this answer的启发,这里有一个替代方案可以检索当时的最新记录(如果你不想平均):

Point.from(
           Point.select("max(unix_timestamp(created_at)) as max_timestamp")
                .group("HOUR(created_at)") # subquery
          )
     .joins("INNER JOIN points ON subquery.max_timestamp = unix_timestamp(created_at)")

这将导致以下查询:

SELECT `points`.* 
FROM (
      SELECT max(unix_timestamp(created_at)) as max_timestamp 
      FROM `points` 
      GROUP BY HOUR(created_at)
     ) subquery 
INNER JOIN points ON subquery.max_timestamp = unix_timestamp(created_at)

如果您愿意,也可以使用MIN来获取小时的第一条记录。