如何从2表中获取最近的DateTime


在SQLite中,我想构建一个查询以针对“刻度”列表获取“标签”条目的最接近日期时间:

CREATE TABLE Tick    (
     id integer primary key,dt varchar(20) 
    );

INSERT INTO Tick (id,dt) VALUES 
( 1,'2018-10-30 13:00:00'),( 2,'2018-10-30 14:00:00'),( 3,'2018-10-30 15:00:00'),( 4,'2018-10-30 16:00:00'),( 5,'2018-10-30 17:00:00'),( 6,'2018-10-30 18:00:00'),( 7,'2018-10-30 19:00:00'),( 8,'2018-10-31 05:00:00'),( 9,'2018-10-31 06:00:00'),(10,'2018-10-31 07:00:00');


CREATE TABLE Tag    (
     id integer primary key,dt varchar(20) 
    );

INSERT INTO Tag (id,dt) VALUES 
(100,'2018-10-30 16:08:00'),(101,'2018-10-30 17:30:00'),(102,'2018-10-30 19:12:00'),(103,'2018-10-31 04:00:00'),(104,'2018-10-31 13:00:00');

以下查询为我提供了很好的匹配项(基于diff),但我无法获取Tick列:

SELECT Tag.dt,(SELECT ABS(strftime('%s',Tick.dt) - strftime('%s',Tag.dt)) as diff
        FROM Tick
        ORDER BY diff ASC
        LIMIT 1
       ) as diff from Tag


我尝试了以下操作,但是在ORDER BY中收到Tag.dt的错误消息:

SELECT 
     Tag.id,Tag.dt,Tick.id,Tick.dt,abs(strftime('%s',Tag.dt)) as Diff FROM Tag   JOIN Tick   ON Tick.dt =    (SELECT Tick.dt
    FROM Tick 
    ORDER BY abs(strftime('%s',Tag.dt)) ASC
    limit 1)


我想要的结果是这样的:

TagID,DateTimetag,TickID,DateTimeTick
    100,2018-10-30 16:08:00,4,2018-10-30 16:00:00
    101,2018-10-30 17:30:00,6,2018-10-30 18:00:00
    102,2018-10-30 19:12:00,7,2018-10-30 19:00:00
    103,2018-10-31 04:00:00,8,2018-10-31 05:00:00
    104,2018-10-31 13:00:00,10,2018-10-31 07:00:00

稍后编辑...
根据{{​​3}}的答案,我能够导出某些内容而无需使用FME中无法使用的ROW_COUNTER()关键字。我还设置了最大增量时间差(10000秒)来找到匹配项:

SELECT t.TagId,t.Tagdt,t.TickId,t.Tickdt,MIN(t.Diff)
FROM
(
SELECT 
     Tag.id as TagId,Tag.dt as Tagdt,Tick.id as TickId,Tick.dt as Tickdt,Tag.dt)) as Diff
FROM Tag,Tick
WHERE Diff < 10000
) AS t
GROUP BY t.TagId


再次感谢!

zw60236636 回答:如何从2表中获取最近的DateTime

使用ROW_NUMBER()窗口功能:

SELECT t.tagID,t.tagDT,t.tickID,t.tickDT
FROM (
  SELECT t.*,ROW_NUMBER() OVER (PARTITION BY t.tagID,t.tagDT ORDER BY t.Diff) AS rn
  FROM (
    SELECT Tag.id tagID,Tag.dt tagDT,Tick.id tickID,Tick.dt tickDT,ABS(strftime('%s',Tick.dt) - strftime('%s',Tag.dt)) as Diff 
    FROM Tag CROSS JOIN Tick 
  ) AS t                                        
) AS t  
WHERE t.rn = 1 

请参见demo
结果:

| tagID | tagDT               | tickID | tickDT              |
| ----- | ------------------- | ------ | ------------------- |
| 100   | 2018-10-30 16:08:00 | 4      | 2018-10-30 16:00:00 |
| 101   | 2018-10-30 17:30:00 | 5      | 2018-10-30 17:00:00 |
| 102   | 2018-10-30 19:12:00 | 7      | 2018-10-30 19:00:00 |
| 103   | 2018-10-31 04:00:00 | 8      | 2018-10-31 05:00:00 |
| 104   | 2018-10-31 13:00:00 | 10     | 2018-10-31 07:00:00 |
,

创建一个temp_table查询以获取TickTag表的叉积的时间戳差异,并为每个{{ 1}}表min s。 这两个temp_table查询是相同的。 请注意,此查询可能效率不高,因为它需要在两个表中使用完全叉积

Tick
本文链接:https://www.f2er.com/3079051.html

大家都在问