Sql 如何从最近的存档表中获取ID所在的记录
我在SQLServer2008R2中链接了MAS会计系统中的数据库。该数据库中工资记录的工作方式是,每个季度都要对工资表进行归档,并在删除任何已终止员工的情况下创建一个新的当前季度表。它确实有唯一的员工ID。存档和当前版本中的结构相同 因此,在一年的第二季度,在第一季度被解雇的员工只在数据库的第一季度副本中。在第一季度和第二季度工作的员工在第一季度副本和第二季度副本中。第二季度雇佣的员工仅在第二季度发生 我需要能够建立一套临时表,视图,任何工作,包括每个员工的最新记录。此集合将作为诸如营业额、职位平均工资等查询的基础 我可以通过EmployeeID列的联合来快速创建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。存档和当前版本中的结构相同 因此,在一年的第二季度,在第一季度被解雇的员工只在数据库的第一季度副本中。在第一季度和第二季度工作的员工在第一季度副本和第二季度副本中。第二季度雇佣的员工仅在第二季度发生 我需要能够建立一套临时表,视图,任何工作,包括每个员工的最新记录。此集合将作为诸如营业额、职
是否有一种合理有效的方法将历史数据库合并在一起,只为每个员工保留最新的行?用这种方式表述这个问题后,我是否应该进行一系列合并,从最新到最旧的归档副本,在不匹配时插入?有更好的方法吗?有几种方法可以解决这个问题。这里有一个: 创建一个视图以合并表,在每个表中添加一个适当的存档日期列 在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