如何按小时查询SQLite数据?

How to query SQLite data hourly?

数据 table 如下所示:

ID DATE 
 1 2020-12-31 10:10:00
 2 2020-12-31 20:30:00
 3 2020-12-31 20:50:00
 4 2021-01-02 17:10:00
 5 2021-01-02 17:20:00
 6 2021-01-02 17:30:00
 7 2021-01-03 23:10:00
 ..

我只想查询每天每小时的最后一个条目,并得到如下结果:

ID DATE 
 1 2020-12-31 10:10:00
 3 2020-12-31 20:50:00
 6 2021-01-02 17:30:00
 7 2021-01-03 23:10:00
 ..

我尝试查找每小时查询并找到以下内容

strftime('%H', " + DATE + ", '+1 hours')

但是,不确定如何正确使用它(例如,使用 GROUP BY ?然后如何确保它采用该小时的最新条目),因此,在这里得到一些帮助会很棒!

您可以使用 ROW_NUMBER() window 函数:

SELECT ID, DATE
FROM (
  SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY strftime('%Y%m%d%H', DATE) ORDER BY DATE DESC) rn
  FROM tablename  
)
WHERE rn = 1
ORDER BY ID

代替strftime('%Y%m%d%H', DATE)你也可以使用substr(DATE, 1, 13).

对于 3.25.0 之前不支持 window 函数的 SQLite 版本,您可以使用 NOT EXISTS:

SELECT t1.*
FROM tablename t1
WHERE NOT EXISTS (
  SELECT 1 
  FROM tablename t2
  WHERE strftime('%Y%m%d%H', t2.DATE) = strftime('%Y%m%d%H', t1.DATE)
    AND t2.DATE > t1.DATE  
)

参见demo
结果:

> ID | DATE               
> -: | :------------------
>  1 | 2020-12-31 10:10:00
>  3 | 2020-12-31 20:50:00
>  6 | 2021-01-02 17:30:00
>  7 | 2021-01-03 23:10:00