在 Snowflake SQL 中制定相关子查询(按行检查条件)

Formulate correlated subqueries (row-wise check of condition) in Snowflake SQL

我有两个 table。第一个 table 看起来像这样:

CompanyID  | TIMESTAMP           | NewsitemID 
---------------------------------------------    
ID1        | 2000-01-06 15:00:00 | 1       
ID2        | 2000-01-06 15:32:00 | 2
ID1        | 2000-01-07 14:00:00 | 3
ID3        | 2000-01-07 17:00:00 | 4

现在我想更新时间戳,如果它落在第二个 table 中给出的两个连续关闭时间之间。新的时间戳应该是相应的 SelectedTimestamp 指示的两个连续条目中的第二个。这是第二个table:

Closingtime         | SelectedTimestamp 
-----------------------------------------          
2000-01-05 16:00:00 | --
2000-01-06 16:00:00 | 2000-01-06 16:00:00
2000-01-07 16:00:00 | 2000-01-07 16:00:00
2000-01-10 16:00:00 | 2000-01-10 16:00:00

那么,我想要实现的是:

CompanyID  | TIMESTAMP           | NewsitemID | NewTimestamp
-------------------------------------------------------------------    
ID1        | 2000-01-06 15:00:00 | 1          | 2000-01-06 16:00:00    
ID2        | 2000-01-06 15:32:00 | 2          | 2000-01-06 16:00:00
ID1        | 2000-01-07 14:00:00 | 3          | 2000-01-07 16:00:00
ID3        | 2000-01-07 17:00:00 | 4          | 2000-01-10 16:00:00

但我对 Snowflake SQL 还很陌生,甚至在开始查询时也遇到了问题。我想我可能会在

的方向上使用一些东西
SELECT SelectedTimestamp 
WHERE TIMESTAMP BETWEEN lower_bound AND upper_bound

但我不知道如何 "loop" 通过 ClosingTime 给出的下限和上限。

任何关于我如何继续这里的提示都将不胜感激!

我不能 100% 确定您想要的预期行为是什么,因为第二个 table 列是相同的。 此外,您没有指定 "lower/upper bounds" 对您意味着什么,但我假设您指的是连续两行。

无论哪种情况,Snowflake 实际上都对子查询提供了相当丰富的支持。希望这就是您所需要的:

select first.*, 
(select min(selectedtimestamp) 
  from second where closingtime > first.timestamp) as newtimestamp 
from first;
-----------+---------------------+------------+---------------------+
 COMPANYID |      TIMESTAMP      | NEWSITEMID |    NEWTIMESTAMP     |
-----------+---------------------+------------+---------------------+
 id1       | 2000-01-06 15:00:00 | 1          | 2000-01-06 16:00:00 |
 id2       | 2000-01-06 15:32:00 | 2          | 2000-01-06 16:00:00 |
 id3       | 2000-01-07 14:00:00 | 3          | 2000-01-07 16:00:00 |
 id4       | 2000-01-07 17:00:00 | 4          | 2000-01-10 16:00:00 |
-----------+---------------------+------------+---------------------+