2012-01-17 63 views
3

我有一个SQL查询做了一些排名,如:SQL:在使用从选择计算字段在WHERE子句

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

我想使用的排名在WHERE条件在最后。

现在我将这个查询嵌套在另一个查询中,并对那里的排名进行筛选,但是有没有更简单或更快的方法来过滤来自SELECT语句的这些值?

回答

7

使用CTE(公共表表达式) - 排序的“内联”的说法只是为下一个声明:

;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! 
+3

谢谢。下一次我提出一个关于SQL查询的问题时,我会问自己这个问题'CTE是一种解决方案吗?' – 2012-01-18 08:58:36

0

对不起,以前的发布,我忘了:窗口功能只能用于选择或按顺序排序。 您必须使用子查询:

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

OR CTE。

+0

这工作,但这是我已经做了(嵌套),我有点要求其他方式来做到这一点。这就是为什么我接受他的答案marc_s,这是唯一一个给我另一个解决方案的人。 – 2012-01-18 09:01:06