Установка переменных внутри SELECT - PullRequest
0 голосов
/ 07 августа 2020

Я сейчас переписываю запрос 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, которое было бы полезно

1 Ответ

1 голос
/ 07 августа 2020

Невозможно изменить значения SQL переменных в операторе SELECT. Единственно возможный вариант - использовать команду SET для назначения / изменения значения переменной SQL в Snowflake:

https://docs.snowflake.com/en/sql-reference/session-variables.html

Я понимаю, что MySQL ' s очень полезны, но Snowflake не поддерживает те же функции.

...