Снежинка SQL UDF: SELECT TOP N, LIMIT, ROW_NUMBER () И RANK () не работают в подзапросах? - PullRequest
0 голосов
/ 21 января 2020

Я экспериментировал с решениями UDF Snowflake SQL, чтобы добавить желаемое количество рабочих дней к метке времени. Я пытался определить функцию, которая принимает временную метку и желаемое количество рабочих дней для добавления в качестве параметров и возвращает дату. Функция использует таблицу измерений даты. Функция работает, когда я передаю ей одну дату в качестве параметра, но всякий раз, когда я пытаюсь дать ей полный столбец дат, она выдает ошибку «Неподдерживаемый тип подзапроса не может быть оценен». Кажется, это происходит всякий раз, когда я пытаюсь использовать SELECT TOP N, LIMIT, ROW_NUMBER () или RANK () в подзапросе.

Вот пример подхода, который я попробовал:

CREATE OR REPLACE FUNCTION "ADDWORKINGDAYSTOWORKINGDAY"(STARTDATE TIMESTAMP_NTZ, DAYS NUMBER)
RETURNS DATE
LANGUAGE SQL
AS '
    WITH CTE AS ( 
SELECT PAIVA 
    FROM EDW_DEV.REPORTING_SCHEMA."D_PAIVA"
    WHERE ARKIPAIVA = 1 AND ARKIPYHA_FI = FALSE 
    AND 1 = CASE WHEN DAYS < 0 AND P.PAIVA < TO_DATE(STARTDATE) THEN 1
                 WHEN DAYS < 0 AND P.PAIVA >= TO_DATE(STARTDATE) THEN 0
                 WHEN DAYS >= 0 AND P.PAIVA > TO_DATE(STARTDATE) THEN 1
                 ELSE 0
            END),
CTE2 AS (           
SELECT
    PAIVA
    ,CASE WHEN DAYS >= 0 THEN RANK() OVER
        (ORDER BY PAIVA)
        ELSE RANK() OVER 
        (ORDER BY PAIVA DESC)
    END AS RANK
FROM CTE
ORDER BY RANK)

SELECT TOP 1
ANY_VALUE (CASE WHEN DAYS IS NULL OR TO_DATE(STARTDATE) IS NULL THEN NULL
     WHEN DAYS = 0 THEN TO_DATE(STARTDATE)
     ELSE PAIVA
     END) AS PAIVA
FROM CTE2 
WHERE CASE  WHEN DAYS IS NULL OR TO_DATE(STARTDATE) IS NULL THEN 1 = 1
            WHEN DAYS > 0 THEN RANK = DAYS
            WHEN DAYS = 0 THEN 1 = 1
            ELSE RANK = -DAYS
      END
  ';

1 Ответ

1 голос
/ 21 января 2020

UDF являются скалярными. Они вернут только одно значение указанного типа, в данном случае дату. Если вы хотите вернуть набор значений для столбца, вы можете исследовать UDTF, определяемые пользователем функции таблицы, которые возвращают таблицу.

https://docs.snowflake.net/manuals/sql-reference/udf-table-functions.html

С небольшим изменением вашего UDF вы можете преобразовать его в UDTF. Вы можете передать ему столбцы вместо скалярных значений. Затем вы можете объединить таблицу, полученную из UDTF, с базовой таблицей, чтобы получить дополнительные значения рабочего дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...