SQL:在WHERE子句中使用SELECT中的计算字段

4

我有一个 SQL 查询,进行了一些排名操作,如下所示:

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

我希望在WHERE语句的结尾中使用该排名。

现在我将此查询嵌套在另一个查询中,并在那里对排名进行过滤,但是否有更简单或更快速的方法可以从SELECT语句中过滤这些值?

3个回答

8
使用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)是一个解决方案?” - Erik Dekker

1

对于之前的帖子我很抱歉,我忘记了:窗口函数只能在select或order by子句中使用。你需要使用子查询:

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

OR A CTE.


这个方法是可行的,但这就是我已经做过的(嵌套),而我也想询问其他方法来解决这个问题。这就是为什么我接受了marc_s的答案,他是唯一提供给我另一种解决方案的人。 - Erik Dekker

1

这个可以用,但我已经做过了(嵌套),我想问其他的方法。 - Erik Dekker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接