Я сейчас переписываю запрос mySQL 5.7
на Snowflake
. Я хотел бы сохранить как можно большую часть запроса mySQL
при преобразовании в Snowflake
.
ПРОБЛЕМА : проблема, с которой я столкнулся, заключается в том, что у меня есть пользовательские переменные, которые динамически изменяются в зависимости от предыдущего значения в данном столбце, и я не могу воспроизвести эту функцию. Мне удалось set
переменных, но когда я пытаюсь изменить их значение, как описано, я получаю серию ошибок.
MySQL Запрос :
SELECT
temp.id,
temp.profile_id,
temp.citations,
temp.DataValue,
@rank := CASE
WHEN @prevId = temp.profile_id AND @prevDataValue = temp.DataValue THEN @rank+1
ELSE 1
END as DataValueRank,
@prevId := temp.profile_id AS prevId,
@prevDataValue := temp.DataValue AS prevDataValue
FROM
l.temp AS temp,
(SELECT @prevId := 0, @prevDataValue := 0, @rank := 0) AS X
ORDER BY
profile_id DESC,
DataValue ASC,
citations DESC
в приведенном выше запросе мы имеем, что @prevId будет значением предыдущего значения, найденного в столбце profile_id
, аналогично для @prevDataValue
и DataValue
.
Таблица, которая создается выглядит следующим образом:
id profile_id citations DataValue DataValueRank prevId prevDataValue
...
24508771 1003077033 1 E04.936.580.225 49 1003077033 E04.936.580.225
24160975 1003077033 1 E04.987 50 1003077033 E04.987
24160975 1003077033 1 E04.987.775 51 1003077033 E04.987.775
28079605 1003077025 9 C10 1 1003077025 C10
28079605 1003077025 9 C10.597 2 1003077025 C10.597
...
Где l.temp
совпадает с указанным выше с последними тремя столбцами:
id profile_id citations DataValue
...
24508771 1003077033 1 E04.936.580.225
24160975 1003077033 1 E04.987
24160975 1003077033 1 E04.987.775
28079605 1003077025 9 C10
28079605 1003077025 9 C10.597
...
ATTEMPT
Snowflake Query
SET (prevId, prevDataValue, rank) = (0, 0, 0); -- AS X
Я думаю, что это действует как инициализатор моей переменной, аналогичный
SELECT @prevId := 0, @prevDataValue := 0, @rank := 0) AS X
SELECT
temp.id,
temp.profile_id,
temp.citations,
temp.DataValue,
-- $rank = CASE
-- WHEN $prevId = temp.profile_id AND $prevDataValue = temp.DataValue THEN $rank+1
-- ELSE 1
-- END as DataValueRank, -- THIS WON'T CHANGE VALUE DEPENDING ON THE CASE
-- $prevId = temp.profile_id, -- THIS WON'T CHANGE VALUE
-- $prevDataValue = temp.DataValue -- THIS WON'T CHANGE VALUE
FROM
DATAWAREHOUSE.MY_DATA AS temp,
ORDER BY
profile_id DESC,
DataValue ASC,
citations DESC
;
Если кто-нибудь знает, как переменные могут изменяться значение в операторе SELECT
, которое было бы полезно