SQL Select 计算 where 子句

Posted

技术标签:

【中文标题】SQL Select 计算 where 子句【英文标题】:SQL Select calculation in where clause 【发布时间】:2016-01-25 18:18:23 【问题描述】:

我有一个 select 语句,对于其中一个返回值,我使用了一个计算。

我想做的是在 where 子句中使用计算的结果。像这样的:

SELECT 
ROW_NUMBER()OVER(PARTITION BY val1 ORDER BY val2) AS rnum,
val3,
FROM TestDb 
Where (rnum = 1) 

但它不喜欢rnumwhere 中。

我正在考虑创建一个表并添加到该表中。然后我就可以select where rnum ... 但这似乎不太优雅。有没有更好的办法?

【问题讨论】:

SELECT * FROM(your query here) WHERE rnum=1 或使用 CTE 是最常用的解决方案 您能否发布架构以及您想要的结果? 感谢 Mihai - 效果很好 :-) 【参考方案1】:

您需要使用派生表(子查询/cte):

WITH cte AS
(
  SELECT ROW_NUMBER()OVER(PARTITION BY val1 ORDER BY val2) AS rnum,
         val3
  FROM TestDb
)
SELECT *
FROM cte
WHERE rnum = 1;

如果您想知道为什么不能直接使用它,请阅读SQL Condition on Window function

【讨论】:

val3后面的逗号需要去掉【参考方案2】:

试试:

Select * from (
SELECT 
ROW_NUMBER()OVER(PARTITION BY val1 ORDER BY val2) AS rnum, val3
FROM TestDb )TestDb 
Where (rnum = 1) 

【讨论】:

以上是关于SQL Select 计算 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

sql中select的作用是

sql语句解析顺序和执行顺序

where条件放在子SQL语句中是否查询速度更快?

我需要从 SQL Server 查询中获取前 5 条记录,但要计算满足 where 子句条件的所有记录

EXISTS 子句在 SQL Server 中如何工作?

Oracle SQL 性能优化技巧