You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite中如何筛选最新日期时间数据并保存至新表?

按ID提取最新日期及对应时间的记录并创建新表

需求:从Table 1中选取每个ID对应的最新日期下的最晚结束时间记录,将这些数据保存到名为Table 2的新表中。

Table 1结构及数据

IDDATE_1RUNTIME_1DATEENDTIME_1
12021-12-1210:09:562021-12-1215:09:56
12021-12-1209:09:562021-12-1216:09:56
22020-05-2213:09:122021-05-2222:09:56
22020-05-2209:43:232021-05-2210:09:56
22020-05-2111:43:232021-05-2221:09:56

目标Table 2结构及数据

IDDATE_1RUNTIME_1DATEENDTIME_1
12021-12-1209:09:562021-12-1216:09:56
22020-05-2213:09:122021-05-2222:09:56

尝试过的代码

CREATE TABLE table2 AS
SELECT *
FROM table1
WHERE DATE_1>= DATE AND ENDTIME_1>= RUNTIME_1;

解决方案

方法1:使用窗口函数(推荐,兼容多数现代SQL数据库)

窗口函数ROW_NUMBER()可以轻松实现分组排序后取第一条记录的需求,逻辑清晰且性能较好:

CREATE TABLE table2 AS
SELECT t.ID, t.DATE_1, t.RUNTIME_1, t.DATE, t.ENDTIME_1
FROM (
    SELECT *,
           -- 按ID分组,先按DATE降序(取最新日期),再按ENDTIME_1降序(取该日期下最晚结束时间)
           ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE DESC, ENDTIME_1 DESC) AS rn
    FROM table1
) t
WHERE t.rn = 1;

方法2:关联子查询(兼容旧版MySQL等不支持窗口函数的数据库)

如果你的数据库不支持窗口函数,可以用子查询嵌套的方式实现:

CREATE TABLE table2 AS
SELECT t1.*
FROM table1 t1
WHERE (t1.ID, t1.DATE, t1.ENDTIME_1) IN (
    SELECT ID, DATE, MAX(ENDTIME_1)
    FROM table1
    WHERE DATE = (SELECT MAX(DATE) FROM table1 WHERE ID = t1.ID)
    GROUP BY ID, DATE
);

逻辑说明

  • 对于每个ID,先筛选出该ID下最新的DATE;
  • 在该DATE的所有记录中,再筛选出ENDTIME_1最晚的那条记录,就是我们需要的目标数据。

内容的提问来源于stack exchange,提问作者kora_num14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:06:34