SQL 案例1 按秒分组取每天最新记录
要按时间分组并精确到秒,同时过滤出每天最新的1条记录,可以使用SQL中的ROW_NUMBER()
窗口函数来实现。假设你的表名为your_table
,时间字段为timestamp
,以下是一个示例查询:
WITH ranked_records AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY DATE(timestamp) ORDER BY timestamp DESC) AS rn
FROM
your_table
)
SELECT
*
FROM
ranked_records
WHERE
rn = 1;
解释:
-
ROW_NUMBER()
: 这是一个窗口函数,它为每一行分配一个唯一的序号。我们使用PARTITION BY DATE(timestamp)
来按天分组,然后使用ORDER BY timestamp DESC
按时间降序排列,确保最新的记录排在前面。 -
WITH ranked_records AS (...)
: 这是一个CTE(Common Table Expression),用于创建一个临时的结果集ranked_records
,其中包含了每一行在当天的排名。 -
SELECT * FROM ranked_records WHERE rn = 1
: 最后,我们从ranked_records
中选择排名为1的记录,即每天最新的1条记录。
注意:
-
DATE(timestamp)
函数用于提取日期部分,确保按天分组。 -
如果你的数据库不支持
DATE()
函数,可以使用相应的日期提取函数(如CAST(timestamp AS DATE)
)。
示例:
假设你的表your_table
有以下数据:
id | timestamp | value |
---|---|---|
1 | 2023-10-01 12:34:56 | 100 |
2 | 2023-10-01 13:00:00 | 200 |
3 | 2023-10-02 09:00:00 | 300 |
4 | 2023-10-02 10:00:00 | 400 |
执行上述查询后,结果将是:
id | timestamp | value | rn |
---|---|---|---|
2 | 2023-10-01 13:00:00 | 200 | 1 |
4 | 2023-10-02 10:00:00 | 400 | 1 |
这样你就得到了每天最新的1条记录。