Sql server 使用行号()比较N和N-1记录。。性能问题

Sql server 使用行号()比较N和N-1记录。。性能问题,sql-server,tsql,Sql Server,Tsql,我试图比较[N]和[N-1]记录,按c\u id顺序按b\u id DESC划分。查询执行得很好,但对于ROW\u NUMBER()函数运行得非常慢。最昂贵的领域是索引查找、分区排序和散列匹配。是否有任何方法可以编写查询以提高性能 Select [N].*,[N-1]* from ( ( Select p_id,b_id,c_id,cust_name,TNP,TRQI,First_One_Latest from ( Selec

我试图比较[N]和[N-1]记录,
按c\u id顺序按b\u id DESC划分。查询执行得很好,但对于
ROW\u NUMBER()
函数运行得非常慢。最昂贵的领域是索引查找、分区排序和散列匹配。是否有任何方法可以编写查询以提高性能

Select [N].*,[N-1]* from  
(
    (
        Select p_id,b_id,c_id,cust_name,TNP,TRQI,First_One_Latest 
        from (
            Select p_id, b_id, c_id, cust_name, TNP, TRQI,
                    ROW_NUMBER() OVER (Partition By c_id ORDER BY b_id DESC) First_One_Latest 
            from data.Counterparty_Credit_Risk 
            where ISNUMERIC(c_id)=1 
            and cust_src_system=N'SET1' 
        ) As FIRST 
        where FIRST.First_One_Latest=1
    ) As [N] 
    INNER JOIN 
    (
        Select p_id,b_id,c_id,cust_name,TNP,TRQI,First_One_Latest 
        from (
            Select p_id,b_id,c_id,cust_name,TNP,TRQI
            ,ROW_NUMBER() OVER (Partition By c_id ORDER BY b_id DESC) First_One_Latest 
            from data.Counterparty_Credit_Risk 
            where ISNUMERIC(c_id)=1 
            and cust_src_system=N'SET1' 
        ) As Second 
        where Second.First_One_Latest=2
    ) As [N-1]   
        ON N.c_id = [N-1].c_id 
)
请参阅,了解如何在问题中包含执行计划。执行计划是(大多数)查询性能问题的起点。公共表表达式(CTE)允许您生成一次行号,然后将生成的行连接在一起。通常,
mysql
sqlserver
标记是不兼容的(如它们的描述中所述)。您需要一个同时适用于这两个行的解决方案吗?您真的想要当前行和上一行的所有列吗?如果没有,您可以使用
LAG
函数。可能存在重复问题;)。