而不是 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
在我上一个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