Sql 选择带有行号的范围

Sql 选择带有行号的范围,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要一个SQL Server 2008表中的数据,该表的序列号(行号)与顺序相反(desc) 我的表名是ProductDetails 我使用这个查询 WITH Sum_Ctl (TOt) as ( select count(*)+1 from ProductDetails where ProductDetails.UserId = 38 ) SELECT Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) AS S

我需要一个SQL Server 2008表中的数据,该表的序列号(行号)与顺序相反(desc)

我的表名是
ProductDetails

我使用这个查询

WITH Sum_Ctl (TOt) as 
(
    select count(*)+1 
    from ProductDetails 
    where ProductDetails.UserId = 38 
)
SELECT 
    Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) AS SNO,
    * 
FROM
    ProductDetails, Sum_Ctl 
WHERE
    UserId = 38 
用户38的表中存在2192行数据。我使用上面的查询得到它

SNO  column 2192  2191  2190  .... to  1
问题是:我只需要20行数据,即2020到2000行

我在2020年到2000年期间尝试了
和SNO
,但是得到了

列名“SNO”无效

然后我试着

where 
    UserId = 38  
    and Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) between 2020 and 2000
但是

窗口函数只能出现在SELECT或ORDER BY子句中


任何帮助都将不胜感激。

这里的问题是您不能在子句中使用窗口函数。这是经济衰退的结果。简言之,行号是在处理完所有其他内容后生成的,包括您的应用程序中可能包含的任何筛选器

您可以使用子查询或CTE来解决此限制。在本例中,在子查询中计算。这反过来又被主查询过滤

示例

SELECT
    *
FROM
    (
        -- SNIO will be available to outer WHERE.
        SELECT
            ROW_NUMBER() OVER (ORDER BY PrdID ASC) AS sno,
            *
        FROM
            ProductDetails 
        WHERE
            ProductDetails.UserId = 38 
    ) AS sq
WHERE
    sno BETWEEN 2000 AND 2020
;

这是因为在将结果传递给外部查询之前,子查询会被完整地处理。

这里的问题是您不能在子句中使用窗口函数。这是经济衰退的结果。简言之,行号是在处理完所有其他内容后生成的,包括您的应用程序中可能包含的任何筛选器

您可以使用子查询或CTE来解决此限制。在本例中,在子查询中计算。这反过来又被主查询过滤

示例

SELECT
    *
FROM
    (
        -- SNIO will be available to outer WHERE.
        SELECT
            ROW_NUMBER() OVER (ORDER BY PrdID ASC) AS sno,
            *
        FROM
            ProductDetails 
        WHERE
            ProductDetails.UserId = 38 
    ) AS sq
WHERE
    sno BETWEEN 2000 AND 2020
;

这是因为在将结果传递给外部查询之前,子查询是完整处理的。

如果查询严重出错,请发布示例数据并output@mohan111谢谢你的回复,添加了一个示例屏幕,如果你把查询搞砸了,请发布示例数据并output@mohan111感谢您的回复,添加了一个示例屏幕快照谢谢您的回答,但是“关键字“WHERE”附近的语法不正确”用户ID列是否存在于ProductDetails中?是的,用户ID在此抱歉!我忘了给子查询加别名。示例更新。祝你好运。如果您被困在MS文档的行数生命中。感谢您的回答,但是“关键字“WHERE”附近的语法不正确”用户ID列是否存在于ProductDetails中?是的,用户ID在此抱歉!我忘了给子查询加别名。示例更新。祝你好运。如果您被困在MS文档的行数生命。