使用排序功能在派生列where子句(SQL Server 2008中)(Using ranking-

2019-08-16 21:12发布

希望这是微不足道的SQL忍者......一直试图让下面的查询工作:

这是SQL Server 2008

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) Filtered
WHERE 
    RowNumber BETWEEN 1 AND 5

该值多少有些做作给出一个具体的例子,但查询的精神完整地保留下来。 我从这句话得到的错误是:

无效的列名称ROWNUMBER“。

如果删除了最后的WHERE子句(ROWNUMBER BETWEEN ...),它返回预期的结果集(A_ID,User_Name的,DATE_TIME等),以ROWNUMBER作为列(与无意义的值)在上述结果。 然而,我不能在WHERE子句中比较反对。 我清楚地做一些愚蠢的,但这个命中我的SQL极限!

我试着重新编排这是一个CTE为好,(用过滤AS ...),但最终的结果是一样的,看来这只是一个糖什么我已经在做呢。

想法? 如何过滤对ROWNUMBER派生列?

Answer 1:

您必须将其中创建ROWNUMBER列项目列表上方的WHERE运营商。 使用派生表或CTE:

SELECT * 
  FROM (
   SELECT *, ROW_NUMBER() OVER (...) as RowNumber
   FROM ...) As ...
 WHERE RowNumber = ...

等效CTE是:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
       FROM ...)
SELECT * FROM cte 
WHERE RowNumber = ...   


Answer 2:

窗函数(其中ROW_NUMBER是最清楚)被填充在查询很晚,WHERE子句后良好。 因此,你必须巢太,以在其上进行过滤:

SELECT *
FROM (
    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
    ) Numbered
)  Filtered
WHERE RowNumber BETWEEN 1 AND 5

你也可以把他们的CTE或意见而得到相同的效果。



Answer 3:

与查询问题就来了,因为在逻辑处理顺序故障英寸 这是在MSDN dev的网络中指定的逻辑处理顺序。

SELECT语句的逻辑处理顺序的以下步骤显示逻辑处理顺序,或结合顺序,一个SELECT语句。 此顺序决定时在一个步骤中所定义的对象被提供给在后续步骤中的条款。 例如,如果查询处理器可以结合在所定义的FROM子句(访问)的表或视图,这些目的和其列被提供给所有的后续步骤。 相反,因为SELECT子句是步骤8中,在该条款中所定义的任何列的别名或派生列不能由前述条款中引用。 然而,他们可以通过后续条款引用,如ORDER BY子句。 需要注意的是语句的实际物理执行由查询处理器确定和顺序可以从该列表会有所不同。 从ON JOIN WHERE GROUP BY WITH CUBE或WITH ROLLUP HAVING SELECT DISTINCT ORDER BY TOP

因此,引入分级功能,如从节中的子查询的别名,然后你就可以在那里节上设置别名的情况。

祝好运..!!



文章来源: Using ranking-function derived column in where clause (SQL Server 2008)