我一直在尝试为我的sqlite3数据库创建一个查询,它在最长和最短时间之间以10分钟为间隔向我提供所有记录的计数。
我在互联网上找到了这个答案,似乎有效:
select (((`unixtime`)/600000)*600000) as timeslice,
count(*) as mycount from mytable
where
`unixtime` >= 1413902772599
and
`unixtime` <= 1413972793000
group by timeslice;
我得到的结果是这样的:
timeslice mycount
------------- ----------
1413930000000 9
1413930600000 1013
1413931200000 265
1413932400000 410
1413933000000 643
这似乎是一种执行此查询的hackish方式。它也没有包含零计数的数据点,这是一个边缘情况,我将不得不在数据库范围之外修复(除非有一个SQL解决方案)。
还有更好的方法吗?如果我继续使用此查询,是否存在边缘情况?在我不考虑的某些情况下,这会灾难性地失败吗?
答案 0 :(得分:0)
没有更好的方法来舍入600000的倍数; SQLite有round() function,但你仍然需要转换为可以舍入到某个小数部分的值。
如果您使用的是SQLite 3.8.3或更高版本,则可以使用recursive common table expression生成间隔:
WITH RECURSIVE intervals(t) AS (
VALUES(1413902400000)
UNION ALL
SELECT t + 600000
FROM intervals
WHERE t < 1413972000000
)
SELECT intervals.t,
COUNT(*)
FROM intervals
LEFT JOIN MyTable
ON MyTable.unixtime BETWEEN intervals.t
AND intervals.t + 599999
GROUP BY 1;