Поиск SQL-запроса для получения последней связанной даты для каждой группы - PullRequest
3 голосов
/ 09 марта 2010

У меня есть таблица данных заработной платы, в которой указаны ставки заработной платы и даты вступления в силу, связанные с этими ставками заработной платы, а также часы, отработанные в различные даты. Это выглядит примерно так:

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  ...

...

И так далее. По сути, данные были объединены таким образом, что за каждый отработанный день вся история заработной платы сотрудника объединяется, и я хочу получить ставку заработной платы, связанную с ПОСЛЕДНЕЙ датой вступления в силу, которая не позднее, чем отработанная дата. Таким образом, в приведенном выше примере ставка 7,25, которая вступает в силу 6/10/2009, - это то, что я хочу.

Какой запрос я могу собрать для этого? Я могу использовать MAX (EffectiveDate) вместе с критериями, основанными на том, чтобы быть до даты работы, но это дает мне только самую последнюю дату, я хочу соответствующую зарплату. Я использую Sql Server для этого.

Кроме того, у меня есть оригинальные таблицы, которые использовались для создания этих данных. Одна из них содержит отработанные даты и часы, а также EMPID, другая содержит список ставок заработной платы и даты вступления в силу. Есть ли способ присоединиться к ним, который бы правильно применял правильную ставку заработной платы для каждого рабочего дня?

Я думал, что хочу сгруппировать по EMPID, а затем по DateWorked и что-то сделать оттуда. Я хочу получить результат, который дает мне ставку заработной платы, которая фактически является последней эффективной ставкой для каждой отработанной даты

Ответы [ 4 ]

3 голосов
/ 09 марта 2010
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 голосов
/ 09 марта 2010

попробуйте это:

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

OUTPUT

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)
2 голосов
/ 09 марта 2010

Как-то так должно работать:

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
0 голосов
/ 09 марта 2010
SELECT TOP 1 EMPID, WageRate
 FROM wages
WHERE ...... 
ORDER BY EffectiveDate DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...