Обновление с использованием подзапроса, не работающего в Snowflake - PullRequest
0 голосов
/ 15 октября 2019

(отправка от имени пользователя Snowflake)


В таблицу загружен неверный дубликат идентификатора, и нам нужно исправить его. Правила обновления идентификатора: когда разница во времени превышает 30 минут, идентификатор должен быть новым / уникальным. Я написал запрос, чтобы отфильтровать это, однако обновление не происходит

Ниже приведен запрос, чтобы найти идентификаторы для обновления. Для тестирования я использовал определенный идентификатор.

select id,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP_EST) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc

;

И я мог видеть 12 записей с одинаковым идентификатором и разницей во времени более 30. Однако, когда я пытаюсь обновить. запрос выполнен успешно, но ничего не обновляется.

update table_name t

set t.id = c.newid

from

(select id ,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc) c

where t.id = c.id

and t.timestamp = c.BEFORE_TIME

;

обратите внимание:

Я даже создал временную таблицу t1 из вышеуказанного подзапроса.

И я вижузаписи в таблице t1.

при выполнении select с объединением с основной таблицей я даже вижу в записи в основной таблице.

Но опять же, когда я пытаюсь обновить с использованием нового t1. обновляется только нулевая запись.

Я даже попытался объединить, но та же проблема.

MERGE INTO snowplow_data_subset_temp t

USING t1

ON (trim(t.visit_id) = trim(t1.visit_id) and trim(t1.BEFORE_DATE) = trim(t.TIMESTAMP_EST))

WHEN MATCHED THEN UPDATE SET visit_number = newid;

Любые рекомендации, идеи или обходные пути? Спасибо!

1 Ответ

0 голосов
/ 21 октября 2019

Похоже, что они могут работать по двум причинам: таблица, которую вы создали t1, это была временная или клонированная таблица? Проверьте

Get_DDL ('t1', 'schemaname');

, чтобы проверить, есть ли какие-либо ограничения на временную таблицу в сеансе, над которым вы работаете в этомследующий. Или вы можете запросить представление таблицы ограничений «В качестве альтернативы, получить список всех ограничений таблицы по схеме (или по всем схемам в базе данных), запросив представление TABLE_CONSTRAINTS View в информационной схеме». from: https://docs.snowflake.net/manuals/user-guide/table-considerations.html#referential-integrity-constraints

Поскольку подзапрос работает просто отлично - операторы слияния и обновления являются подсказками для поиска, вот что я нашел в документации для более общей информации:

* Ограничения для подзапросов: https://docs.snowflake.net/manuals/user-guide/querying-subqueries.html#limitations

Вы также можете проверить наличие ошибок для запроса на обновление, изменив сеанс: https://docs.snowflake.net/manuals/sql-reference/sql/update.html#usage-notes

ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE;

Вот пример использования обновления с таблицей Temp: https://snowflakecommunity.force.com/s/question/0D50Z00008P7BznSAF/can-you-use-a-cte-or-temp-table-with-an-update-statement-to-update-a-table

Я с нетерпением жду, как онив итоге решил проблему.

...