Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL连接-根据ID和时间戳选择最新的时间间隔_Sql_Join_Snowflake Cloud Data Platform - Fatal编程技术网

SQL连接-根据ID和时间戳选择最新的时间间隔

SQL连接-根据ID和时间戳选择最新的时间间隔,sql,join,snowflake-cloud-data-platform,Sql,Join,Snowflake Cloud Data Platform,我有两个表,见下表,T1有ID和时间戳列,另一个T2有ID和两个时间戳,它们作为间隔,开始时间和结束时间。对于T1,可以有重复的ID,但每个ID的时间戳值永远不会重复。对于T2,可以有重复的ID,但间隔永远不会重复。间隔可以有相同的开始时间,但不能有相同的结束时间。此外,开始时间通常会增加到最近,但并不总是如此,但不会减少。结束时间可以变化,通常会增加,但可以减少,但不能小于开始时间 要说所有这些都是从T1开始的给定时间戳,当根据开始时间和结束时间之间的ID和时间戳进行连接时,它可以从T2开始分

我有两个表,见下表,T1有ID和时间戳列,另一个T2有ID和两个时间戳,它们作为间隔,开始时间和结束时间。对于T1,可以有重复的ID,但每个ID的时间戳值永远不会重复。对于T2,可以有重复的ID,但间隔永远不会重复。间隔可以有相同的开始时间,但不能有相同的结束时间。此外,开始时间通常会增加到最近,但并不总是如此,但不会减少。结束时间可以变化,通常会增加,但可以减少,但不能小于开始时间

要说所有这些都是从T1开始的给定时间戳,当根据开始时间和结束时间之间的ID和时间戳进行连接时,它可以从T2开始分成许多间隔

我试图在ID上加入T1和T2,时间戳位于T2的最新间隔之间

T1

身份证件 时间戳 1. 2021-01-01 08:05:00 2. 2021-01-01 08:07:00 2. 2021-01-01 15:45:00 3. 2021-01-01 20:01:00
这看起来是使用横向连接的好地方:

编辑:

遗憾的是,上述情况无法评估。以下是另一个版本:

select t12.*
from (select t1.*, t2.*,
             row_number() over (partition by t1.id order by t2.start_time desc) as seqnum
      from table1 t1 left join lateral
           table2 t2
         on t2.id = t1.id and
            t1.timestamp between t2.start_time and t2.end_time

     ) t12
where seqnum = 1;

您需要调整子查询中的列以避免重复的列名。

这看起来是使用横向联接的好地方:

编辑:

遗憾的是,上述情况无法评估。以下是另一个版本:

select t12.*
from (select t1.*, t2.*,
             row_number() over (partition by t1.id order by t2.start_time desc) as seqnum
      from table1 t1 left join lateral
           table2 t2
         on t2.id = t1.id and
            t1.timestamp between t2.start_time and t2.end_time

     ) t12
where seqnum = 1;

您需要调整子查询中的列,以避免重复的列名。

在发布之前,我尝试了类似的方法,但只使用了左外连接和TOP 1*,而不是limit 1。系统在t2.id=t1.id的行中不断抛出该t1.id,并且该标识无效。不确定这是不是系统问题@用户2715877。您是否使用了侧向连接?这是横向连接的语法。是的,我确实按照你发布的那样尝试了。但是,我必须取消限制1不能与该行一起运行,并且查询只返回T1中所有行的匹配项的子集。对于左连接,它不应该返回所有T1吗?在进一步检查侧面后,它将只返回匹配项。如果T1中有另一行,ID=4,时间戳=2021-01-01 23:14:00。查询将如何更改以确保返回T1中的所有行?我应该更新原始帖子吗?@user2715877。left join lateral返回表1中的所有行,所以我不知道您的评论指的是什么。至于限制-雪花使用fetch first 1 row或select top。我在发布之前尝试了类似的方法,但只是使用了左外连接和top 1*,而不是限制1。系统在t2.id=t1.id的行中不断抛出该t1.id,并且该标识无效。不确定这是不是系统问题@用户2715877。您是否使用了侧向连接?这是横向连接的语法。是的,我确实按照你发布的那样尝试了。但是,我必须取消限制1不能与该行一起运行,并且查询只返回T1中所有行的匹配项的子集。对于左连接,它不应该返回所有T1吗?在进一步检查侧面后,它将只返回匹配项。如果T1中有另一行,ID=4,时间戳=2021-01-01 23:14:00。查询将如何更改以确保返回T1中的所有行?我应该更新原始帖子吗?@user2715877。left join lateral返回表1中的所有行,所以我不知道您的评论指的是什么。至于限制-雪花使用获取前1行或选择顶部。