查找 sql 查询以获取每个分组的最新关联日期
Posted
技术标签:
【中文标题】查找 sql 查询以获取每个分组的最新关联日期【英文标题】:Finding a sql query to get the latest associated date for each grouping 【发布时间】:2010-03-09 17:46:48 【问题描述】:我有一个工资数据的 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 1/10/2010 ...
2 1/1/2010 ...
...
等等。基本上,数据已经以这样一种方式组合在一起,即对于每一天的工作,所有员工的工资历史都被连接在一起,我想获取与不迟于工作日期的最新生效日期相关的工资率。所以在上面的例子中,2009 年 6 月 10 日生效的 7.25 的比率是我想要的。
我可以为此组合什么样的查询?我可以使用 MAX(EffectiveDate) 以及基于工作日期之前的标准,但这只会给我最新的日期本身,我想要相关的工资。我为此使用 Sql Server。
或者,我有用于创建这些数据的原始表。其中一个包含工作日期、小时数以及 EMPID,另一个包含工资率和生效日期列表。有没有办法加入这些,而不是在每个工作日正确应用正确的工资率?
我想我想先按 EMPID 分组,然后按 DateWorked 分组,然后从那里做点什么。我想得到一个结果,它给我的工资率实际上是每个工作日期的最新有效工资率
【问题讨论】:
【参考方案1】: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
【讨论】:
【参考方案2】:试试这个:
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
输出
EMPID WageRate EffectiveDate
----------- --------------------------------------- -----------------------
1 8.00 2010-02-01 00:00:00.000
2 12.00 2009-02-01 00:00:00.000
(2 row(s) affected)
【讨论】:
这是寻找今天之前的最新生效日期,而不是 WorkedDate 之前的最新生效日期,否则它看起来是一个不错的方法。【参考方案3】:这样的事情应该可以工作:
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
【讨论】:
【参考方案4】:SELECT TOP 1 EMPID, WageRate
FROM wages
WHERE ......
ORDER BY EffectiveDate DESC
【讨论】:
以上是关于查找 sql 查询以获取每个分组的最新关联日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组
Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目