SQL: используйте вычисляемые поля из SELECT в предложении WHERE - PullRequest
3 голосов
/ 17 января 2012

У меня есть SQL-запрос, который делает некоторое ранжирование, например:

SELECT RANK() OVER(PARTITION BY XXX ORDER BY yyy,zzz,oooo) as ranking, * 
FROM SomeTable
WHERE ranking = 1 --> this is not possible

Я хочу использовать это ранжирование в состоянии ГДЕ в конце.

Теперь я вкладываю этот запрос в другой запрос и выполняю там фильтрацию ранжирования, но нет ли более простого или быстрого способа фильтрации таких значений из оператора SELECT?

Ответы [ 3 ]

7 голосов
/ 17 января 2012

Использовать CTE (Common Table Expression) - что-то вроде «встроенного» представления только для следующего оператора:

;WITH MyCTE AS
(
    SELECT 
        RANK() OVER(PARTITION BY XXX ORDER BY yyy,zzz,oooo) as ranking, 
        * 
    FROM SomeTable
) 
SELECT * 
FROM MyCTE
WHERE ranking = 1 --> this is now possible!
1 голос
/ 17 января 2012
select * from (
select RANK() OVER(PARTITION BY name ORDER BY id) as ranking, *  
from PostTypes
) A
where A.ranking = 1

http://data.stackexchange.com/stackoverflow/query/edit/59515

0 голосов
/ 17 января 2012

Извините за предыдущую публикацию, я забыл: оконные функции могут использоваться только в выражениях select или order by.Вам нужно будет использовать подзапрос:

SELECT * FROM 
(
  SELECT RANK() OVER(PARTITION BY XXX ORDER BY yyy,zzz,oooo) as ranking, * 
  FROM SomeTable
) t
WHERE ranking = 1

ИЛИ CTE.

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