如何在 WHERE 子句中使用具有 RANK() OVER 的别名

Man*_*265 2 sql-server window-functions sql-server-2014

我有一个查询,其中包含一个RANK() OVER函数,但我想在后面的 WHERE 子句中使用此列上显示的结果。我怎么写,因为我看过的所有其他问题都没有,RANK() OVER而且似乎更容易做到。这是声明:

USE SMSResults


SELECT Student_No,Result,Module_Name,Semester,Year,RANK() OVER (PARTITION BY Student_No ORDER BY Semester  DESC) AS Rnk
FROM tbl_results
WHERE Student_No = '201409'

ORDER BY Year DESC
Run Code Online (Sandbox Code Playgroud)

我想使用子句中的RnkWHERE

Kin*_*hah 7

我想在 WHERE 子句中使用 Rnk 列

Rnk是中计算的列SELECT子句。它WHERE在同一级别的子句中不可用,因为查询执行的逻辑顺序是FROM -> WHERE -> SELECT

您必须将查询包装在子查询中。您可以使用CTE(公用表表达式)

USE SMSResults ;
go
with CTE as 
    ( SELECT Student_No,Result,Module_Name,Semester,Year,
             RANK() OVER (PARTITION BY Student_No ORDER BY Semester  DESC) AS Rnk
      FROM tbl_results
      WHERE Student_No = '201409')
select * from CTE 
where rnk > 1   -- change here with whatever you want ... !!
ORDER BY Year DESC ;
Run Code Online (Sandbox Code Playgroud)

或派生表:

USE SMSResults ;
go   
select * from
    ( SELECT Student_No,Result,Module_Name,Semester,Year,
             RANK() OVER (PARTITION BY Student_No ORDER BY Semester  DESC) AS Rnk
      FROM tbl_results
      WHERE Student_No = '201409') 
  AS derived_table
where rnk > 1   -- change here with whatever you want ... !!
ORDER BY Year DESC ;
Run Code Online (Sandbox Code Playgroud)

作为未来读者的附注 - 值得一读 - CTE 和临时表之间有什么区别?通过JNK?