T SQL Rank功能未按预期工作

时间:2013-03-21 22:03:18

标签: sql-server tsql

再一次,我真的需要你的专业知识。看起来我在这里的排名并不好...... 我返回了两条记录,即使它们的日期时间略有不同,它们也都排在第一位。几分钟。谢谢你们,我一如既往地感谢你的帮助。

                SELECT  CD.MEMACT,
                     CD.DATETIME,--DATETIME
                     CD.AG_ID,
                     RANK() OVER (PARTITION BY 
                                       CD.MEMACT,
                                       CD.DATETIME,
                                       CD.AG_ID
                                ORDER BY CD.DATETIME)RANKED

                 FROM MEM_ACT_TBL
                 WHERE CD.MEMACT='1024518'

2 个答案:

答案 0 :(得分:2)

如果没有看到您的数据,我可以说这是由于分区方法。您的“分区”语句基本上是您分组的,以确定号码位置重置。 'order by'决定了你如何订购数据的顺序。看到这个简单的例子,在我的第一个窗口函数中,我使用了太多的分区,因此只显示了一大堆冗余的分区。

简单的自我提取示例:

declare @Person Table ( personID int identity, person varchar(8));

insert into @Person values ('Brett'),('Sean'),('Chad'),('Michael'),('Ray'),('Erik'),('Queyn');

declare @Orders table ( OrderID int identity, PersonID int, Desciption varchar(32), Amount int);

insert into @Orders values (1, 'Shirt', 20),(1, 'Shoes', 50),(2, 'Shirt', 22),(2, 'Shoes', 52),(3, 'Shirt', 20),(3, 'Shoes', 50),(3, 'Hat', 20),(4, 'Shirt', 20),(5, 'Shirt', 20),(5, 'Pants', 30),
(6, 'Shirt', 20),(6, 'RunningShoes', 70),(7, 'Shirt', 22),(7, 'Shoes', 40),(7, 'Coat', 80)

Select
    p.person
,   o.Desciption
,   o.Amount
,   row_number() over(partition by person, Desciption order by Desciption) as [Wrong I Used Too Many Partitions]
,   row_number() over(partition by person order by Desciption) as [Correct By Alpha of Description]
,   row_number() over(partition by person order by Amount desc) as [Correct By Amount of Highest First]
from @Person p
    join @Orders o on p.personID = o.PersonID

我猜你可以这样做:

SELECT  
   CD.MEMACT,
   CD.DATETIME,--DATETIME
   CD.AG_ID,
   RANK() OVER (PARTITION BY CD.MEMACT ORDER BY CD.DATETIME, CD.AG_ID) RANKED
   FROM MEM_ACT_TBL
   WHERE CD.MEMACT='1024518'

答案 1 :(得分:2)

您提供的此示例数据违反了您的期望:

MEMACT   DATETIME         AG_ID    RANK
-------  ---------------  -------  ----
1024518  12/26/2013 7:43  Ag_1541  1
1024518  12/26/2013 7:53  Ag_2488  1

但在您的示例代码中,您PARTITION BY CD.MEMACT, CD.DATETIME, CD.AG_ID。这明确意味着将不共享这些值的所有行视为完全独立的排序系列。由于您在上面显示的两行不具有相同的MEMACTDATETIMEAG_ID值,因此它们各自从1开始排名。

如果您希望上面的两行按等级提升,那么除了MEMACT之外,您不能进行任何分区,因为只有那些行在行之间是相同的。然后,你最有可能按DATETIME然后AG_ID订购(如果你有两行具有相同的日期,则获得确定性),如下所示:

PARTITION BY CD.MEMACT ORDER BY CD.DATETIME, CD.AG_ID

PARTITION BY ORDER BY的任何排名函数都没有意义,同一列将确保ORDER BY没有区别要使用的数据,因为您已经将所有单独的系列隔离在同一列中。