再一次,我真的需要你的专业知识。看起来我在这里的排名并不好...... 我返回了两条记录,即使它们的日期时间略有不同,它们也都排在第一位。几分钟。谢谢你们,我一如既往地感谢你的帮助。
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'
答案 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
。这明确意味着将不共享这些值的所有行视为完全独立的排序系列。由于您在上面显示的两行不具有相同的MEMACT
,DATETIME
和AG_ID
值,因此它们各自从1开始排名。
如果您希望上面的两行按等级提升,那么除了MEMACT
之外,您不能进行任何分区,因为只有那些行在行之间是相同的。然后,你最有可能按DATETIME
然后AG_ID
订购(如果你有两行具有相同的日期,则获得确定性),如下所示:
PARTITION BY CD.MEMACT ORDER BY CD.DATETIME, CD.AG_ID
对PARTITION BY
和 ORDER BY
的任何排名函数都没有意义,同一列将确保ORDER BY
没有区别要使用的数据,因为您已经将所有单独的系列隔离在同一列中。