mariadb 获取给定范围内每天的第一个和最后一个行项目

xdnvmnnf  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个数据库表,其中每天有多个行项目(每小时一个)。当查询数据库时,我可以获得每天的项目,并可以按日期范围和时间进行过滤,如下所示:

SELECT * FROM readings 
WHERE date_recorded > '2022-01-01' 
AND date_recorded < '2022-01-15' 
AND time_recorded > '08:00:00' 
AND time_recorded < '17:00:00';

(Yes,我意识到我可以执行BETWEEN,但这不是当前构建此查询的方式,因此这是我必须处理的)。
这将给予给定日期范围内8到5之间的所有读数,但我只想得到每天的第一个和最后一个读数。我可以执行SELECT MIN()操作并将其与SELECT MAX()操作联合,但在当前查询中,这将只给出整个日期范围内的第一个和最后一个读数(即2022-01-01 08:00:00和2022-01-15 17:00:00),而且我需要每天的第一个和最后一个读数。
我知道我可以通过在提取结果后循环这些结果来对日期进行一些清理,但我想知道是否有一种干净的方法可以在MariaDB(MySQL)中的一个命令中完成这一切?
我不知道这是否会有什么不同,但我将在使用PDO的PHP框架中进行此操作。

tcomlyy6

tcomlyy61#

在MySQL 8+上,我们可以在这里使用ROW_NUMBER()

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY date_recorded ORDER BY time_recorded) rn1,
              ROW_NUMBER() OVER (PARTITION BY date_recorded ORDER BY time_recorded DESC) rn2
    FROM readings
    WHERE date_recorded BETWEEN '2022-01-01' AND '2022-01-15' AND
          time_recorded BETWEEN '08:00:00' AND '17:00:00'
)

SELECT *
FROM cte
WHERE rn1 = 1 OR rn2 = 1
ORDER BY date_recorded, time_recorded;

相关问题