Oracle Оконная функция не работает в SnowFlake - PullRequest
1 голос
/ 23 марта 2020

я работаю над миграцией Oracle в Snowflake.

при переносе оконных функций oracle на снежинку, получая ошибку ниже, не могли бы вы сообщить, альтернативный способ для функции oracle в снежинке.

SELECT 
      COL1,
      COL2, ...,
      SUM(SUM(TAB1.COL1)) OVER (PARTITION BY 
          TAB1.COL2,
          TAB1.COL3,
          TAB1.COL4,
          TAB1.COL5,
          TAB1.COL6,
          TAB1.COL7,
          TAB1.COL8,
          TAB1.COL9,
          TAB1.COL10,
      ORDER BY MAX(CALENDAR_TAB.DATE_COLUMN) RANGE BETWEEN INTERVAL '21' DAY PRECEDING  AND CURRENT ROW)/4 AS COLMN

      FROM TAB1,CALENDAR_TAB
      JOIN
      GROUP BYCOL1,
      COL2, ...

Ниже приведено сообщение об ошибке: Ошибка QL [1003] [42000]: SQL Ошибка компиляции: строка синтаксической ошибки 75 в позиции 60 неожиданного «ИНТЕРВАЛ». Синтаксическая ошибка строки 75 в позиции 78 неожиданного «PRECEDING».

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Документ Оконная рама - хорошее место для начала.

Если я правильно прочитал синтаксис Oracle, то оконная рама, которую вы используете для MAX, основана на значениях aka (интервал '21' день), который не поддерживает Snowflake, он поддерживает только N строк на основе логики c. Если у вас есть 1 строка в день и всегда 1 строка, то вы можете использовать число строк logi c, но в противном случае это не поддерживается.

Это означает, что вы присоединяетесь к своим собственным таблицам данных и применить фильтр предыдущего времени к объединению.

2 голосов
/ 23 марта 2020

Согласно документации для Snowflake, вот синтаксис:

https://docs.snowflake.com/en/sql-reference/functions-analytic.html#window -синтаксис-и-использование

slidingFrame ::=
    {
       ROWS BETWEEN <N> { PRECEDING | FOLLOWING } AND <N> { PRECEDING | FOLLOWING }
     | ROWS BETWEEN UNBOUNDED PRECEDING AND <N> { PRECEDING | FOLLOWING }
     | ROWS BETWEEN <N> { PRECEDING | FOLLOWING } AND UNBOUNDED FOLLOWING
    }

Может не понравиться INTERVAL и цитируемый номер.

...