我编写了一个Rails 4应用程序,它接受并绘制传感器数据。有时每小时有10个点(但这个数字不固定)。我正在绘制数据并对Points.all进行简单查询以获取所有数据点。
为了减少查询大小,我想每小时只返回一条记录。返回哪条记录无关紧要。使用created_at字段每小时的第一条记录就可以了。
如何构建查询来执行此操作?
答案 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
来获取小时的第一条记录。