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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 如何从最近的存档表中获取ID所在的记录_Sql_Sql Server_Sql Server 2008 R2_Greatest N Per Group - Fatal编程技术网

Sql 如何从最近的存档表中获取ID所在的记录

Sql 如何从最近的存档表中获取ID所在的记录,sql,sql-server,sql-server-2008-r2,greatest-n-per-group,Sql,Sql Server,Sql Server 2008 R2,Greatest N Per Group,我在SQLServer2008R2中链接了MAS会计系统中的数据库。该数据库中工资记录的工作方式是,每个季度都要对工资表进行归档,并在删除任何已终止员工的情况下创建一个新的当前季度表。它确实有唯一的员工ID。存档和当前版本中的结构相同 因此,在一年的第二季度,在第一季度被解雇的员工只在数据库的第一季度副本中。在第一季度和第二季度工作的员工在第一季度副本和第二季度副本中。第二季度雇佣的员工仅在第二季度发生 我需要能够建立一套临时表,视图,任何工作,包括每个员工的最新记录。此集合将作为诸如营业额、职

我在SQLServer2008R2中链接了MAS会计系统中的数据库。该数据库中工资记录的工作方式是,每个季度都要对工资表进行归档,并在删除任何已终止员工的情况下创建一个新的当前季度表。它确实有唯一的员工ID。存档和当前版本中的结构相同

因此,在一年的第二季度,在第一季度被解雇的员工只在数据库的第一季度副本中。在第一季度和第二季度工作的员工在第一季度副本和第二季度副本中。第二季度雇佣的员工仅在第二季度发生

我需要能够建立一套临时表,视图,任何工作,包括每个员工的最新记录。此集合将作为诸如营业额、职位平均工资等查询的基础

我可以通过EmployeeID列的联合来快速创建ID列表,但其他列会随着时间的推移而改变工资率、地址等,因此我不能简单地联合所有列,因为我会为一些员工创建重复的列


是否有一种合理有效的方法将历史数据库合并在一起,只为每个员工保留最新的行?用这种方式表述这个问题后,我是否应该进行一系列合并,从最新到最旧的归档副本,在不匹配时插入?有更好的方法吗?

有几种方法可以解决这个问题。这里有一个:

创建一个视图以合并表,在每个表中添加一个适当的存档日期列 在EmployeeID上对视图组创建子查询,并获取最大存档日期 使用子查询加入视图并获取每个员工的最新记录 创建示例表架构和测试数据

    SET NOCOUNT ON

    IF OBJECT_ID('Employee', 'U') IS NOT NULL DROP TABLE Employee;
    GO
    IF OBJECT_ID('Employee2012Q1', 'U') IS NOT NULL DROP TABLE Employee2012Q1;
    GO
    IF OBJECT_ID('Employee2012Q2', 'U') IS NOT NULL DROP TABLE Employee2012Q2;
    GO

    CREATE TABLE dbo.Employee (
        EmployeeID      int IDENTITY(1,1)   NOT NULL    PRIMARY KEY
       ,EmployeeName    varchar(50)         NOT NULL
       ,StartDate       smalldatetime       NOT NULL
       ,EndDate         smalldatetime       NULL
       ,Salary          decimal(18,2)       NOT NULL
       ,Position        varchar(50)         NOT NULL
       ,HomeAddress     varchar(200)        NOT NULL
    )

    -- Employees hired
    INSERT dbo.Employee SELECT 'John Doe', '01/01/2012', NULL, 50000, 'Developer', '12345 Main St, New York, NY'
    INSERT dbo.Employee SELECT 'Jane Doe', '01/01/2012', NULL, 52000, 'Developer', '837 1st St, New York, NY'

    -- Employee fired
    UPDATE A
       SET A.EndDate = '02/01/2012'
      FROM dbo.Employee A
     WHERE A.EmployeeName = 'John Doe'

    -- Table archived
    SELECT * INTO dbo.Employee2012Q1 FROM dbo.Employee

    --  Remove fired employees
    DELETE dbo.Employee WHERE EndDate IS NOT NULL

    -- Employee hired
    INSERT dbo.Employee SELECT 'Jack Flash', '04/01/2012', NULL, 73000, 'Manager', '9580 21st St, New York, NY'

    -- Employee fired
    UPDATE A
       SET A.EndDate = '05/01/2012'
      FROM dbo.Employee A
     WHERE A.EmployeeName = 'Jack Flash'

    -- Table archived
    SELECT * INTO dbo.Employee2012Q2 FROM dbo.Employee

    --  Remove fired employees
    DELETE dbo.Employee WHERE EndDate IS NOT NULL

    SET NOCOUNT OFF
    GO
创建一个合并所有employee表的视图

    IF OBJECT_ID('EmployeeArchive', 'V') IS NOT NULL DROP VIEW dbo.EmployeeArchive
    GO
    CREATE VIEW dbo.EmployeeArchive
    AS
    SELECT CONVERT(smalldatetime, CONVERT(char(10), GETDATE(), 101)) as [ArchiveDate]
          ,EmployeeID
          ,EmployeeName
          ,StartDate
          ,EndDate
          ,Salary
          ,Position
          ,HomeAddress
     FROM dbo.Employee 
    UNION ALL
    SELECT CONVERT(smalldatetime, '03/31/2012') as [ArchiveDate]
          ,EmployeeID
          ,EmployeeName
          ,StartDate
          ,EndDate
          ,Salary
          ,Position
          ,HomeAddress
      FROM dbo.Employee2012Q1 
    UNION ALL
    SELECT CONVERT(smalldatetime, '06/30/2012') as [ArchiveDate]
          ,EmployeeID
          ,EmployeeName
          ,StartDate
          ,EndDate
          ,Salary
          ,Position
          ,HomeAddress
      FROM dbo.Employee2012Q2 
    GO
获取每个员工的最新信息

    SELECT A.*
      FROM dbo.EmployeeArchive A
      JOIN (
            SELECT EmployeeID, MAX(ArchiveDate) as MaxArchiveDate
              FROM dbo.EmployeeArchive
             GROUP BY EmployeeID
           ) B
        ON A.EmployeeID  = B.EmployeeID
       AND A.ArchiveDate = B.MaxArchiveDate