而不是ROW_NUMBER ORDER
问题描述:
在我上一篇文章(下面的链接)中,我试过使用ROW_NUMBER ORDER BY
并最终得到了所需的解决方案。请参阅以下链接:而不是ROW_NUMBER ORDER
Get Wages Yearly Increment Column Wise Using Sql
现在我尝试使用下面的查询SQL Server 2000中,只是为了演示的目的。我知道,ROW_NUMBER ORDER BY
不能用于它。而一些谷歌上搜索后,试图使用SQL Server 2000中的以下内容:(1查询)
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
。谢谢。
注:我没有在这里再次包含表结构和示例数据。没关系 - 你可以看到之前的文章。
答
要重新创建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
我想,用'Generic'这个词,你问的是表中唯一的id,如果是的话,它是包含的。谢谢你的回答@SqlZim。 –
@ AT-2017我应该使用'surrogate'这个词,我会纠正这个问题。 – SqlZim
它的工作,我只是稍微改变这一节'哪里l.Empid = m.Empid和l.Amt = m.IncrementID' (在第一个查询中),因为我在** EmpIncrement **表中拥有唯一的ID。非常感谢@SqlZim。 –