Сформулируйте коррелированные подзапросы (построчную проверку состояния) в Snowflake SQL - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть две таблицы.Первая таблица выглядит следующим образом:

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

Теперь я хочу обновить временную метку, если она попадает между двумя последовательными временами закрытия, указанными во второй таблице.Новая временная метка должна быть второй из двух последовательных записей, как указано соответствующей 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 голосов
/ 18 ноября 2018

Я не уверен на 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 |
-----------+---------------------+------------+---------------------+
...