查找 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 查询以获取每个分组的最新关联日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以逐块获取最新数据

MySQL中最新订单状态的SQL查询

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目

如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]

用于基于三个参数查找唯一行的 SQL 查询 - 类似于“在已排序的分组集中获取第一行”