Sql server 2008 为什么这个sql RANK OVER()命令给我所有的秩1

Sql server 2008 为什么这个sql RANK OVER()命令给我所有的秩1,sql-server-2008,Sql Server 2008,在下面的查询中,我尝试按最高的computedWorstDerogLevel和最低的RecentDerogMonths对行进行排序,但它将所有行都排序为1 SELECT strTransID, strRateCode as PreviousHighRateCode, strRateStatusCode as TradelineRateCode, dateReported, d

在下面的查询中,我尝试按最高的computedWorstDerogLevel和最低的RecentDerogMonths对行进行排序,但它将所有行都排序为1

SELECT 
            strTransID,
            strRateCode as PreviousHighRateCode,
            strRateStatusCode as TradelineRateCode,
            dateReported,
            datePreviousHigh,
            CASE
                WHEN 
                    strRateStatusCode IN ('2', '3', '4', '5', '7', '8', '9', 'F', 'G', 'H', 'M', 'Z', '#', '$')
                    AND
                    (
                        strRateStatusCode IN ('F', 'G', 'H', 'M', 'Z', '#', '$')
                        OR strRateStatusCode >= strRateCode 
                    )
                THEN 
                    strRateStatusCode 
                ELSE 
                    strRateCode 
            END AS WorstDerogLevel
            ,
                DateDiff(month, 
                    CASE 
                        WHEN 
                            ( 
                                dateReported >= datePreviousHigh 
                                OR datePreviousHigh is null
                            )
                            AND strRateStatusCode IN ('2', '3', '4', '5', '7', '8', '9', 'F', 'G', 'H', 'M', 'Z', '#', '$')
                            AND
                            (
                                strRateStatusCode IN ('F', 'G', 'H', 'M', 'Z', '#', '$')
                                OR strRateStatusCode >= strRateCode 
                            )
                        THEN 
                            dateReported 
                        ELSE 
                            datePreviousHigh 
                    END, 
                    dateTransDate) as RecentDerogMonths

            ,

        RANK() OVER   
        (
            PARTITION BY 
                DateDiff(month, 
                    CASE 
                        WHEN 
                            ( 
                                dateReported >= datePreviousHigh 
                                OR datePreviousHigh is null
                            )
                            AND strRateStatusCode IN ('2', '3', '4', '5', '7', '8', '9', 'F', 'G', 'H', 'M', 'Z', '#', '$')
                            AND
                            (
                                strRateStatusCode IN ('F', 'G', 'H', 'M', 'Z', '#', '$')
                                OR strRateStatusCode >= CstrRateCode 
                            )
                        THEN 
                            dateReported 
                        ELSE 
                            datePreviousHigh 
                    END, 
                    dateTransDate) 

            ORDER BY

            CASE
                WHEN 
                    strRateStatusCode IN ('2', '3', '4', '5', '7', '8', '9', 'F', 'G', 'H', 'M', 'Z', '#', '$')
                    AND
                    (
                        strRateStatusCode IN ('F', 'G', 'H', 'M', 'Z', '#', '$')
                        OR strRateStatusCode >= strRateCode 
                    )
                THEN 
                    strRateStatusCode 
                ELSE 
                    strRateCode 
            END desc,

                DateDiff(month, 
                    CASE 
                        WHEN 
                            ( 
                                dateReported >= datePreviousHigh 
                                OR datePreviousHigh is null
                            )
                            AND strRateStatusCode IN ('2', '3', '4', '5', '7', '8', '9', 'F', 'G', 'H', 'M', 'Z', '#', '$')
                            AND
                            (
                                strRateStatusCode IN ('F', 'G', 'H', 'M', 'Z', '#', '$')
                                OR strRateStatusCode >= strRateCode 
                            )
                        THEN 
                            dateReported 
                        ELSE 
                            datePreviousHigh 
                    END, 
                    dateTransDate) asc

        ) AS Rank  

     FROM 
        [Customers]

    WHERE strTransID = '279579407'
这是我的结果集

只需添加两列PartitionField和OrderField,并在上面的列组中添加表达式,即可调试查询

有两种情况下,每行的秩=1

每行属于不同的分区,因此分区大小为1。 分区中的所有行都有相同的值,都是秩1。
好的,已经有了,partition by字段与RecentDerogMonths相同,order by是WorstDerogLevel desc RecentDerogMonths asc,在上面的例子中,我希望19个月排名1,看起来你有第二个案例。分区中的所有行都具有相同的WorstDerogLevelbtw如果您是按RecentDerogMonths分区的,那么就没有按RecentDerogMonths排序的点,因为分区中的所有元素都具有相同的值。如果我澄清我正在尝试做什么,您可以帮我。我只想要最近几个月最低的,最糟糕的;我想这是最好的办法。我明白你的意思。把分区拿出来给我我想要的。