1

再一次,我真的需要你的专业知识。看起来我在这里的排名不太好......我返回了两条记录,尽管它们的日期时间略有不同,但它们都是排名第一的。几分钟。谢谢大家,我非常感谢您一如既往的帮助。

                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'
4

2 回答 2

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'
于 2013-03-21T22:31:47.047 回答
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. 这明确意味着将所有不共享这些值的行视为完全独立的排名系列。由于您在上面介绍的两行没有相同MEMACTDATETIME、 和AG_ID值,因此它们各自从 1 开始排名。

如果您期望上面的两行排名上升,那么您不能按除 之外的任何内容进行分区MEMACT,因为只有该列在行之间是相同的。然后,您很可能会按DATETIMEthen排序AG_ID(如果您有两行具有相同日期,则获得确定性),如下所示:

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

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

于 2013-03-21T22:47:26.573 回答