在where排名函数派生列用于句子中的排名函数(SQL Server 2008)
技术问答
214 人阅读
|
0 人回复
|
2023-09-14
|
希望这对于SQL忍者微不足道…一直试图查询以下正常工作:
7 @. W7 @" S1 ~这是针对SQL Server 2008& ^/ k! ?# K1 G& h9 ~
SELECT ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber,*FROM (SELECT T.A_ID,T.User_Name,T.Date_Time,T.Value, U.ID,U.Name,U.Field1,U.Field2, COUNT(U.ID) OVER () AS TotalRows FROM TeeTable as T INNER JOIN YouTable AS U ON T.U_ID = U.ID WHERE T.Value BETWEEN 222 AND 225) FilteredWHERE RowNumber BETWEEN 1 AND 5这些值在某种程度上被设计成给出一个特定的例子,但查询的精神完全保留了下来。我从这句话中得到的错误是:" ?+ W1 u- E& V
无效列名 RowNumber”。7 O# b4 W! z: Y) E
如果我删除最后一个WHERE子句(RowNumber BETWEEN
- X# |* J' I# F5 E9 T5 g…),它将返回预期结果集(A_ID,User_Name,Date_Time等…),其中将RowNumber在结果中显示列(包括有意义的值)。但我不能在那里WHERE与之进行比较。我显然在做一些愚蠢的事情,但到了我的目标SQL极限!
% r2 B) B# f& B. [* z" Y+ J) Y我也试图重新安排它CTE,(使用WITH Filtered AS …),但最终的结果是一样的。看来这只是我已经在做的糖。6 `2 f: ~& [% R6 o" b) z
有想法吗?如何过滤衍生物?RowNumber的列?0 x9 T; W, q: E
4 V$ _! A9 ^- R/ z
解决方案:
( Q% W0 K! X. w8 W5 N: G 您必须将WHERE移动到创建运算符RowNumber项目列表 上方 。使用派生表或CTE:5 Y) d5 h- J+ w1 Y
SELECT * FROM ( SELECT *,ROW_NUMBER() OVER (...) as RowNumber FROM ...) As ... WHERE RowNumber = ...等效的CTE为:
( |) c+ ^) B8 x0 U6 m [/ [* A. dWITH cte AS (SELECT *,ROW_NUMBER() OVER (...) as RowNumber FROM ...)SELECT * FROM cte WHERE RowNumber = ... |
|
|
|
|
|