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

时间:2018-11-15 16:44:53

标签: sql correlated-subquery snowflake-datawarehouse

我有两个桌子。第一个表如下所示:

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

现在,如果时间戳记介于第二个表中给出的两个连续的Closingtimes之间,我想更新它。如相应的SelectedTimestamp所示,新的时间戳应该是两个连续条目中的第二个。这是第二张表:

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

但是我不知道如何在ClosingTime给定的上下限之间“循环”。

任何关于我将如何进行此处的提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

我不确定100%想要的预期行为,因为第二个表列是相同的。 另外,您没有指定“下限/上限”对您意味着什么,但我假设您的意思是连续两行。

无论哪种情况,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 |
-----------+---------------------+------------+---------------------+