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