而不是ROW_NUMBER ORDER BY

时间:2017-05-26 16:47:11

标签: sql sql-server-2000

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

Get Wages Yearly Increment Column Wise Using Sql

现在我正在尝试在Sql server 2000中使用以下查询,仅用于演示目的。我知道,ROW_NUMBER ORDER BY不能用在其中。经过一些谷歌搜索,尝试使用以下Sql server 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。感谢。

注意:我没有再次在此处包含表格结构和示例数据。没关系 - 你可以看到早先的帖子。

1 个答案:

答案 0 :(得分:1)

要重新创建partition by EmpId,您的子查询应该有l.EmpId = m.Empid。您确实需要一个唯一的列或一组列来唯一标识一行以使此版本正常工作。在基于给定数据的尝试中,如果EmpId, Amt是唯一对,则可以使用and l.Amt < m.Amt。如果您在桌面上有代理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()列的临时表。

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
相关问题