Как найти повторяющиеся строки, если я не могу использовать ROW_NUMBER () в WHERE? - PullRequest
0 голосов
/ 21 мая 2019

Этот запрос получает строки, которые являются дубликатами.Я буду использовать этот запрос для обновления ссылок на дубликаты перед их удалением.

SELECT TOP 350000 itmopt_pk, item_fk, option_fk,
ROW_NUMBER()OVER(PARTITION BY item_fk, option_fk ORDER BY item_fk ASC, option_fk ASC) AS RN
FROM item_options
WHERE RN > 1
GROUP BY itmopt_pk, item_fk, option_fk
ORDER BY RN DESC

Строка AND RN > 1 не работает и дает мне Invalid column name 'RN'.

Попытка использоватьAND ROW_NUMBER()OVER(PARTITION BY item_fk, option_fk ORDER BY item_fk ASC, option_fk ASC) > 1 дает мне Windowed functions can only appear in the SELECT or ORDER BY clauses

Я использую sqlsrv.

Как я могу вернуть только те строки, где RN > 1?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Какую часть сообщения вы не понимаете?Оконные функции не разрешены в where.Также псевдонимы столбцов не определены в соответствующем SELECT.Используйте подзапрос:

SELECT TOP 350000 itmopt_pk, item_fk, option_fk
FROM (SELECT itmopt_pk, item_fk, option_fk,
             ROW_NUMBER() OVER (PARTITION BY item_fk, option_fk ORDER BY item_fk ASC, option_fk ASC) AS RN
      FROM item_options
     ) io
WHERE RN > 1
GROUP BY itmopt_pk, item_fk, option_fk
ORDER BY RN DESC;

Этот запрос кажется странным.Интересно, есть ли другой способ выразить то, что вы хотите.

2 голосов
/ 21 мая 2019

Вы не можете использовать псевдоним столбца и функции Window в предложении WHERE. Вы можете использовать CTE или Subquery.

Option1: Общее выражение таблицы:

WITH cte_query AS 
(
SELECT itmopt_pk, item_fk, option_fk,
ROW_NUMBER()OVER(PARTITION BY item_fk, option_fk ORDER BY item_fk ASC, option_fk ASC) AS RN
FROM item_options
GROUP BY itmopt_pk, item_fk, option_fk
)
SELECT itmopt_pk, item_fk, option_fk, RN
FROM cte_query
WHERE RN > 1

Опция 2: Подзапрос:

SELECT itmopt_pk, item_fk, option_fk, RN
FROM 
(
SELECT  itmopt_pk, item_fk, option_fk,
ROW_NUMBER()OVER(PARTITION BY item_fk, option_fk ORDER BY item_fk ASC, option_fk ASC) AS RN
FROM item_options
GROUP BY itmopt_pk, item_fk, option_fk
) A
WHERE RN > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...