在 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 |
-----------+---------------------+------------+---------------------+
我有两个 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 |
-----------+---------------------+------------+---------------------+