Sql 而不是按顺序排列
在我的上一篇文章(下面的链接)中,我尝试使用Sql 而不是按顺序排列,sql,sql-server-2000,Sql,Sql Server 2000,在我的上一篇文章(下面的链接)中,我尝试使用行编号顺序BY,最终得到了所需的解决方案。请参阅以下链接: 现在我尝试在Sql server 2000中使用以下查询,只是为了演示。我知道,ROW\u NUMBER ORDER BY不能在其中使用。在谷歌搜索之后,尝试对SQLServer2000使用以下内容:(第一次查询) 类似地,当我将以下内容与行编号顺序一起使用时,它会显示不同的输出:(第二次查询) 输出: ID Name Amt RowNum 1 John 1000
行编号顺序BY
,最终得到了所需的解决方案。请参阅以下链接:
现在我尝试在Sql server 2000中使用以下查询,只是为了演示。我知道,
ROW\u NUMBER ORDER BY
不能在其中使用。在谷歌搜索之后,尝试对SQLServer2000使用以下内容:(第一次查询)
类似地,当我将以下内容与行编号顺序一起使用时,它会显示不同的输出:(第二次查询)
输出:
ID Name Amt RowNum
1 John 1000 1
2 John 2000 2
1 Jack 4000 1
2 Jack 8000 2
因此需要注意的是,在两个查询中,员工ID的分组(RowNum)是不同的,其中第二个查询的输出是正确的。我想知道两个查询输出的区别,以及第一个查询是否等同于行号顺序BY
。谢谢
注意:我没有在这里再次包含表结构和示例数据。没关系-您可以查看前面的帖子。要通过EmpId重新创建分区,您的子查询应该具有l.EmpId=m.EmpId
。要使此版本正常工作,您确实需要一个唯一的列或列集来唯一标识行。在基于给定数据的尝试中,如果EmpId、Amt
是唯一的一对,则可以使用和l.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
我猜,使用单词Generic
,您是在询问表中的唯一id,如果是,则包括在内。谢谢您的回答@SqlZim@AT-2017我应该使用“代理”这个词,我会更正它。它起作用了,我只是稍微更改了这个部分,其中l.Empid=m.Empid和l.Amt=m.IncrementID(在第一个查询中),因为我在empinrement表中有唯一的id。非常感谢@SqlZim@AT-2017,很高兴为您提供帮助!
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
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
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