Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server 2000难题_Sql_Sql Server_Sql Server 2000 - Fatal编程技术网

Sql Server 2000难题

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

我需要基于工资单/日期组合的行动日期的最新记录。所以我在SQLServer2000上尝试了这个。然而,问题是直到SQLServer2008才引入行号

这给了我4条而不是5条记录。ID为4的记录不会返回,因为与操作日期有关联

 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的行?