2012-01-17 97 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