Стандартный ранг Bigquery SQL()

# #sql #google-bigquery #sql-standards

Вопрос:

Мне пришлось преобразовать весь мой устаревший SQL в стандартный SQL.

Я пытаюсь присоединиться и ранжировать() после того, как переключу его на стандартный SQL, и получаю сообщение об ошибке:

«Количество аргументов не соответствует РАНГУ аналитической функции. Поддерживаемая подпись: РАНГ()»

Означает ли это, что функция RANK() не работает в стандарте SQL? Bigquery выделяет «РАНГ(ВЕХА)» как ошибку.

Мы ценим большую помощь.

     JOIN
    (SELECT * FROM 
        (SELECT 
            CASE WHEN MILESTONE NOT LIKE '%M0' THEN 'CWV' ELSE MILESTONE END MILESTONE
            , MAX((LAST_MODIFIED_DATE)) AS LAST_MODIFIED_DATE
            , RANK(MILESTONE) OVER (ORDER BY MILESTONE DESC) AS RANK2     ------------NEED FIXING
            FROM `XXXXX.com:dataservices.Finance.FINANCE_SF_PRODUCT_COST_SNAPSHOT` 
            WHERE LOCKED IS false
            AND (DATE(LAST_MODIFIED_DATE) = (SELECT MAX(DATE(LAST_MODIFIED_DATE)) 
            FROM `XXXXXX.com:dataservices.Finance.FINANCE_SF_PRODUCT_COST_SNAPSHOT`)
            OR MILESTONE LIKE 'M0')
            AND PMD_PRODUCT_STATUS NOT IN ('Canceled','End of Life','No Longer Shipping')
            AND (MILESTONE NOT LIKE '%Exit%' OR MILESTONE NOT LIKE '%M0' OR MILESTONE NOT LIKE '%WP%')
            AND MILESTONE <> '2021_Q2_M0' -- need to show new qtr after each 20th of the month (just increase the Q# 1)
            GROUP BY 1
            ORDER BY 2 DESC
        )
        WHERE RANK2 < 4                       ------------NEED FIXING
    ) MILE
ON PCS.MILESTONES = MILE.MILESTONE
 

Комментарии:

1. Почему тег <sql-стандарты>? (Приведенный выше запрос не соответствует стандарту SQL — по нескольким причинам.)

Ответ №1:

Функция rank() не получает никаких параметров ни в одной базе данных.

так :

 select ...
     , RANK() OVER (ORDER BY MILESTONE DESC) AS RANK2 
...
 

и я предполагаю, что вы хотели упорядочить выражение, по которому вы группируетесь:

 select ...
     , RANK() OVER (ORDER BY CASE WHEN MILESTONE NOT LIKE '%M0' THEN 'CWV' ELSE MILESTONE END DESC) AS RANK2 
...
 

Комментарии:

1. Мы ценим большую помощь @eshirvana , RANK() OVER (ORDER BY MILESTONE DESC) AS RANK2 ————Порядок окон ПО выражению ссылается на ВЕХУ столбца, которая не сгруппирована и не агрегирована. Это говорит мне сгруппироваться в этой строке? Я довольно новичок в этом SQL

2. под разделением вехи внутри ранга вы подразумеваете «столбец вехи из таблицы или это : CASE WHEN MILESTONE NOT LIKE '%M0' THEN 'CWV' ELSE MILESTONE END , Я думаю , что если вы имели в виду ранжирование по выражению, по которому вы группируетесь, это работает

3. я имею в виду «столбец вехи из таблицы», у меня есть СЛУЧАЙ извлечь столбец ВЕХИ только с «M0».

4. @QuicKick , вот почему вы получаете это сообщение об ошибке , потому что ранжирование по этому столбцу имеет смысл в контексте подзапроса , потому что вы группируетесь с чем-то другим

5. Я имел в виду, что это не имеет смысла