从辅助表中选择第一个表(sqlite)区间内的时间戳

问题描述 投票:0回答:1

假设我们有以下带有一些值(时间戳)的 SQLite 表。

CREATE TABLE main_test (
   main_id INTEGER PRIMARY KEY,
   main_ts INTEGER NOT NULL
);

CREATE TABLE sec_test (
   sec_id INTEGER PRIMARY KEY,
   sec_ts INTEGER NOT NULL
);

INSERT INTO main_test (main_ts) VALUES(1711670399), (1711583999), (1711497599), (1711411199), (1711151999)

INSERT INTO sec_test (sec_ts) VALUES (1711500000), (1711200000)

这些表中的时间戳不匹配,但我需要从辅助表(sec_test)中选择时间戳,这些时间戳位于第一个表(main_test)的时间戳间隔内,因此结果将如下所示:

main_id|main_ts   |sec2_ts   |
-------+----------+----------+
      1|1711670399|      NULL|
      2|1711583999|1711500000| -- 1711500000 is between 1711583999 and 1711497599
      3|1711497599|      NULL|
      4|1711411199|1711200000| -- 1711200000 is between 1711411199 and 1711151999
      5|1711151999|      NULL|

有人知道如何实施吗?初始表(在实际项目中使用)非常大,因此速度很重要。

sql sqlite
1个回答
0
投票

您可以使用带有子查询的 SQL 查询来查找位于 main_test 表中的 main_ts 值区间内的 sec_ts 值。

 SELECT 
    m.main_id,
    m.main_ts,
    (
        SELECT 
            s.sec_ts
        FROM 
            sec_test s
        WHERE 
            s.sec_ts < m.main_ts AND 
            s.sec_ts >= COALESCE((SELECT main_ts FROM main_test WHERE main_id < m.main_id ORDER BY main_id DESC LIMIT 1), 0)
        ORDER BY 
            s.sec_ts DESC
        LIMIT 1
    ) AS sec_ts
FROM 
    main_test m
ORDER BY 
    m.main_id;

确保时间戳列和主键列上有适当的索引。 main_test(main_id, main_ts) 和 sec_test(sec_ts) 上的索引将是有益的。

© www.soinside.com 2019 - 2024. All rights reserved.