在我的上一篇文章(链接下方)中,我尝试使用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
。感谢。
注意:我没有再次在此处包含表格结构和示例数据。没关系 - 你可以看到早先的帖子。
答案 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