而不是 ROW_NUMBER ORDER BY

Instead of ROW_NUMBER ORDER BY

在我上一个post(link以下)中,我尝试使用ROW_NUMBER ORDER BY并最终得到了所需的解决方案。请参阅以下 link:



现在我试图在 Sql 服务器 2000 中使用以下查询,仅用于演示目的。我知道,ROW_NUMBER ORDER BY 不能用在里面。经过一番谷歌搜索后,尝试将以下内容用于 Sql 服务器 2000:(第一个查询)

SELECT k.ID, k.[Name], m.Amt,
    (SELECT COUNT(*) FROM EmpIncrement l WHERE l.EmpID <= m.EmpID) as RowNum
    FROM EmpIncrement m
JOIN Employee k ON m.EmpID = k.ID 

我得到了这个输出:

ID  Name    Amt     RowNum
1   John    2000    2
2   Jack    8000    4
1   John    1000    2
2   Jack    4000    4

类似地,当我将以下内容与 ROW_NUMBER ORDER BY 一起使用时,它会显示不同的输出:(第二个查询)

SELECT k.ID, k.Name, m.Amt, 
        ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY DATEPART(yy,IncrementDate)) as RowNum
    FROM EmpIncrement m 
JOIN Employee k ON k.ID = m.EmpID

输出:

ID  Name    Amt     RowNum
1   John    1000    1
2   John    2000    2
1   Jack    4000    1
2   Jack    8000    2

所以注意到员工 ID (RowNum) 的分组在两个查询中是不同的,其中第二个查询的输出是正确的。我想知道查询输出的区别以及第一个查询是否等于 ROW_NUMBER ORDER BY。谢谢。

注意: 我没有在此处再次包含 table 结构和示例数据。没关系 - 您可以查看较早的 post。

要重新创建 partition by EmpId,您的子查询应该有 l.EmpId = m.Empid。您确实需要一个唯一的列或一组列来唯一标识该版本正常工作的行。在基于给定数据的尝试中,如果 EmpId, Amt 是唯一的一对,您可以使用 and l.Amt < m.Amt。如果你在 table 上有代理人 id,那会比 Amt 更好。

select
    k.id
  , k.[Name]
  , m.Amt
  , ( select count(*)
      from EmpIncrement l
      where l.Empid = m.Empid
        and l.Amt <= m.Amt
  ) as RowNum
from EmpIncrement m
  inner join Employee k
    on m.Empid = k.id

如果您没有一组列来唯一标识行并对其进行排序,则可以使用带有 identity() 列的临时 table。

create table #temp (tmpid int identity(1,1) not null, id int, [Name] varchar(32), Amt int);
insert into #temp (id, [Name], Amt);
select
    k.id
  , k.[Name]
  , m.Amt
from EmpIncrement m
  inner join Employee k
    on m.Empid = k.id;

select 
    t.id
  , t.[Name]
  , t.Amt   
  , ( select count(*)
          from #Temp i
          where i.Empid = t.Empid
            and i.tmpId <= t.tmpId
      ) as RowNum
from #temp t