Sql Server 2000难题
我需要基于工资单/日期组合的行动日期的最新记录。所以我在SQLServer2000上尝试了这个。然而,问题是直到SQLServer2008才引入行号 这给了我4条而不是5条记录。ID为4的记录不会返回,因为与操作日期有关联Sql Server 2000难题,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,我需要基于工资单/日期组合的行动日期的最新记录。所以我在SQLServer2000上尝试了这个。然而,问题是直到SQLServer2008才引入行号 这给了我4条而不是5条记录。ID为4的记录不会返回,因为与操作日期有关联 SELECT Id , ActionDate , Operation , Date , [Payroll Number] FROM [dbo].[tblx] 1 2
SELECT Id ,
ActionDate ,
Operation ,
Date ,
[Payroll Number]
FROM
[dbo].[tblx]
1 2018-01-10 00:00:00.000 NEW 2018-01-30 00:00:00 X0154X
2 2018-01-10 00:00:00.000 NEW 2018-01-31 00:00:00 X0154X
3 2018-01-10 00:00:00.000 NEW 2018-02-01 00:00:00 X0154X
4 2018-01-10 00:00:00.000 DELETE 2018-02-01 00:00:00 X0154X
5 2018-01-10 00:00:00.000 NEW 2018-02-02 00:00:00 X0154X
6 2018-01-10 00:00:00.000 NEW 2018-02-11 00:00:00 X0154X
有没有办法在SQL Server 2000上不使用行号来获取此信息?在窗口前功能日,您可以执行以下操作:
SELECT Id ,
ActionDate ,
Operation ,
Date ,
[Payroll Number]
FROM (SELECT *, (SELECT COUNT(*)
FROM dbo.tblx AS counter
WHERE counter.[Payroll Number] = dbo.tblx.[Payroll Number]
AND counter.[Date] = dbo.tblx.[Date]
AND counter.ActionDate >= dbo.tblx.ActionDate) AS rn
FROM dbo.tblx
WHERE Status IN ( 0, 5 )
AND Category = 'Holiday') AS r1
WHERE r1.rn = 1
Id ActionDate Operation Date Payroll Number
1 2018-01-10 00:00:00.000 NEW 2018-01-30 00:00:00 X0154X
2 2018-01-10 00:00:00.000 NEW 2018-01-31 00:00:00 X0154X
5 2018-01-10 00:00:00.000 NEW 2018-02-02 00:00:00 X0154X
6 2018-01-10 00:00:00.000 NEW 2018-02-11 00:00:00 X0154X
此语法用于不支持窗口功能的数据库,如MySQL、SQLite和MS Access
如果可以按id定义latest,则在子查询中使用该id而不是日期:
SELECT x.*
FROM [dbo].[tblx] x
WHERE x.ActionDate = (SELECT MAX(x2.ActionDate)
FROM [dbo].[tblx] x2
WHERE x2.[Payroll Number] = x.[Payroll Number] AND
x2.Date = x.Date
);
在窗口前功能日,您可以执行以下操作:
SELECT Id ,
ActionDate ,
Operation ,
Date ,
[Payroll Number]
FROM (SELECT *, (SELECT COUNT(*)
FROM dbo.tblx AS counter
WHERE counter.[Payroll Number] = dbo.tblx.[Payroll Number]
AND counter.[Date] = dbo.tblx.[Date]
AND counter.ActionDate >= dbo.tblx.ActionDate) AS rn
FROM dbo.tblx
WHERE Status IN ( 0, 5 )
AND Category = 'Holiday') AS r1
WHERE r1.rn = 1
Id ActionDate Operation Date Payroll Number
1 2018-01-10 00:00:00.000 NEW 2018-01-30 00:00:00 X0154X
2 2018-01-10 00:00:00.000 NEW 2018-01-31 00:00:00 X0154X
5 2018-01-10 00:00:00.000 NEW 2018-02-02 00:00:00 X0154X
6 2018-01-10 00:00:00.000 NEW 2018-02-11 00:00:00 X0154X
此语法用于不支持窗口功能的数据库,如MySQL、SQLite和MS Access
如果可以按id定义latest,则在子查询中使用该id而不是日期:
SELECT x.*
FROM [dbo].[tblx] x
WHERE x.ActionDate = (SELECT MAX(x2.ActionDate)
FROM [dbo].[tblx] x2
WHERE x2.[Payroll Number] = x.[Payroll Number] AND
x2.Date = x.Date
);
这是可行的,但不是很好的代码或sql
SELECT x.*
FROM [dbo].[tblx] x
WHERE x.id = (SELECT MAX(x2.id)
FROM [dbo].[tblx] x2
WHERE x2.[Payroll Number] = x.[Payroll Number] AND
x2.Date = x.Date
);
这是可行的,但不是很好的代码或sql
SELECT x.*
FROM [dbo].[tblx] x
WHERE x.id = (SELECT MAX(x2.id)
FROM [dbo].[tblx] x2
WHERE x2.[Payroll Number] = x.[Payroll Number] AND
x2.Date = x.Date
);
您应该考虑从SqL2000升级,这是一个非常古老的产品,多年来一直没有支持。您应该考虑从SqL2000升级,这是一个非常古老的产品,多年来一直没有支持。给了我所有的6个记录。遗憾的是,两条记录的日期/工资单编号相同,问题依然存在。-希望为此处的每一行返回1个ID从[dbo]选择x.ActionDate,x.Date,x.[Payroll Number]。[tblx]x其中x.ActionDate=从[dbo]选择MAXx2.ActionDate.[tblx]x2其中x2.[Payroll Number]=x.[Payroll Number]x2.Date=x.Date分组x.ActionDate,x.Date,x[工资单编号]@JamesKhan让我问一个问题:你说你想要最新的记录,如果这两行的所有时间都相同,你怎么能确定哪一个是最后一个?!你期望什么样的产出?Gordon不知道这种方法,很高兴知道+1记录ID为1、2、3、5和6。没有ID为4的记录。@James只排除operation=DELETE?提供了全部6条记录的行。遗憾的是,两条记录的日期/工资单编号相同,问题依然存在。-希望为此处的每一行返回1个ID从[dbo]选择x.ActionDate,x.Date,x.[Payroll Number]。[tblx]x其中x.ActionDate=从[dbo]选择MAXx2.ActionDate.[tblx]x2其中x2.[Payroll Number]=x.[Payroll Number]x2.Date=x.Date分组x.ActionDate,x.Date,x[工资单编号]@JamesKhan让我问一个问题:你说你想要最新的记录,如果这两行的所有时间都相同,你怎么能确定哪一个是最后一个?!你期望什么样的产出?Gordon不知道这种方法,很高兴知道+1记录ID为1、2、3、5和6。没有ID为4的记录。@James是否只排除operation=DELETE的行?