# #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
————Порядок окон ПО выражению ссылается на ВЕХУ столбца, которая не сгруппирована и не агрегирована. Это говорит мне сгруппироваться в этой строке? Я довольно новичок в этом SQL2. под разделением вехи внутри ранга вы подразумеваете «столбец вехи из таблицы или это :
CASE WHEN MILESTONE NOT LIKE '%M0' THEN 'CWV' ELSE MILESTONE END
, Я думаю , что если вы имели в виду ранжирование по выражению, по которому вы группируетесь, это работает3. я имею в виду «столбец вехи из таблицы», у меня есть СЛУЧАЙ извлечь столбец ВЕХИ только с «M0».
4. @QuicKick , вот почему вы получаете это сообщение об ошибке , потому что ранжирование по этому столбцу имеет смысл в контексте подзапроса , потому что вы группируетесь с чем-то другим
5. Я имел в виду, что это не имеет смысла