查找sql查询以获取每个分组的最新关联日期
我有一个工资数据的sql表,其中包含工资率和与这些工资率相关的生效日期,以及不同日期的工作时间。看起来有点像这样:查找sql查询以获取每个分组的最新关联日期,sql,tsql,Sql,Tsql,我有一个工资数据的sql表,其中包含工资率和与这些工资率相关的生效日期,以及不同日期的工作时间。看起来有点像这样: EMPID DateWorked Hours WageRate EffectiveDate 1 1/1/2010 10 7.00 6/1/2009 1 1/1/2010 10 7.25 6/10/2009 1 1/1/2010 10 8.00 2/1/2010 1
EMPID DateWorked Hours WageRate EffectiveDate
1 1/1/2010 10 7.00 6/1/2009
1 1/1/2010 10 7.25 6/10/2009
1 1/1/2010 10 8.00 2/1/2010
1 1/10/2010 ...
2 1/1/2010 ...
等等。基本上,数据是以这样一种方式组合的:对于每一天的工作,所有员工的工资历史都被合并在一起,我想获取与不晚于工作日期的最新生效日期相关联的工资率。所以在上面的例子中,我想要的是2009年6月10日生效的7.25利率
我可以为此提出什么样的查询?我可以使用MAXEffectiveDate以及基于工作日期之前的标准,但这只会给出最新日期本身,我想要相关的工资。我正在使用Sql Server进行此操作
或者,我有用于创建此数据的原始表。其中一个包含工作日期、工时以及EMPID,另一个包含工资率和生效日期的列表。有没有一种方法可以将这些因素结合起来,从而正确地为每个工作日应用正确的工资率
我在想,我应该先用EMPID进行分组,然后再进行约会,然后再做一些事情。我想得到一个结果,它给出的工资率实际上是每个工作日期的最新有效工资率
SELECT TOP 1 EMPID, WageRate
FROM wages
WHERE ......
ORDER BY EffectiveDate DESC
DECLARE @YourTable table (EMPID int, DateWorked datetime, Hours int
,WageRate numeric(6,2), EffectiveDate datetime)
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10, 7.00, '6/1/2009')
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10, 7.25, '6/10/2009')
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10, 8.00, '2/1/2010')
INSERT INTO @YourTable VALUES (1,'1/10/2010',10, 20.00,'12/1/2010')
INSERT INTO @YourTable VALUES (2,'1/1/2010' ,8 , 12.00, '2/1/2009')
SELECT
e.EMPID,e.WageRate,e.EffectiveDate
FROM @YourTable e
INNER JOIN (SELECT
EMPID,MAX(EffectiveDate) AS EffectiveDate
FROM @YourTable
WHERE EffectiveDate<GETDATE()+1
GROUP BY EMPID
) dt ON e.EMPID=dt.EMPID AND e.EffectiveDate=dt.EffectiveDate
ORDER BY e.EMPID
这样的事情应该行得通:
SELECT T.* FROM T
INNER JOIN (
SELECT EMPID, MAX(EFFECTIVEDATE) EFFECTIVEDATE
FROM T
WHERE DATEWORKED <= EFFECTIVEDATE
GROUP BY EMPID) t2
ON T2.EMPID = T.EMPID
AND T2.EFFECTIVEDATE = T.EFFECTIVEDATE
这是在寻找今天之前的最新生效日期,而不是工作日期之前的最新生效日期,但在其他方面,这看起来是一个不错的方法。
SELECT T.* FROM T
INNER JOIN (
SELECT EMPID, MAX(EFFECTIVEDATE) EFFECTIVEDATE
FROM T
WHERE DATEWORKED <= EFFECTIVEDATE
GROUP BY EMPID) t2
ON T2.EMPID = T.EMPID
AND T2.EFFECTIVEDATE = T.EFFECTIVEDATE
select p.*
from (
select EMPID, DateWorked, Max(EffectiveDate) as MaxEffectiveDate
from Payroll
where EffectiveDate <= DateWorked
group by EMPID, DateWorked
) pm
inner join Payroll p on pm.EMPID = p.EMPID and pm.DateWorked = p.DateWorked and pm.MaxEffectiveDate = p.EffectiveDate
EMPID DateWorked Hours WageRate EffectiveDate
----------- ----------------------- ----------- --------------------------------------- -----------------------
1 2010-01-01 00:00:00.000 10 7.25 2009-06-10 00:00:00.000