Нужна помощь с запросом SQL - PullRequest
2 голосов
/ 26 ноября 2009

Мне нужна помощь с запросом SQL для SQL Server 2005. Вот пример данных в таблице для запроса:

Id    PersonId      PayrollNum    ContractId     PayrollFrom     PayrollTo
---------------------------------------------------------------------------
 1     432642         85110892     1             01/05/2009      31/05/2009
 2     432642         85110892     1             01/06/2009      30/06/2009
 3     432642         85110892     1             01/07/2009      31/07/2009
 4     432642         85110892     2             01/05/2009      31/05/2009
 5     432642         85110892     2             01/06/2009      30/06/2009
 6     432642         85110892     2             01/07/2009      31/07/2009
 7     432642         85110892     2             01/08/2009      31/08/2009
 8     432642         35110892     1             01/06/2009      30/06/2009
 9     432642         35110892     1             01/05/2009      31/05/2009
10     432642         35110892     1             01/07/2009      31/07/2009

(Надеюсь, все будет хорошо отформатировано - с этой штукой трудно работать с таблицами!)

Мне нужен следующий вывод:

Id
--
 1
 4
 9

Объяснение: в основном мне нужны уникальные значения Id для записей, которые отличаются на PersonId, PayrollNum и ContractId, а также являются наименьшей датой PayrollFrom для каждой группировки. Я не уверен, как это лучше объяснить? Надеемся, что вы можете посмотреть на вывод, чтобы помочь понять требования запроса.

Дайте мне знать, если мне нужно объяснить это лучше (или если вы думаете, что понимаете это и можете объяснить это лучше, сделайте это).

Спасибо за вашу помощь, Джеймс.

Ответы [ 2 ]

9 голосов
/ 26 ноября 2009
WITH CTE AS (
SELECT
    /* uncomment if needed PersonId, PayrollNum, ContractId, PayrollFrom, */
    ID,
    ROW_NUMBER() OVER (
        PARTITION BY PersonId, PayrollNum, ContractId
        ORDER BY PayrollFrom ASC -- thank you to Peter Lang DESC
     ) AS Ranking
FROM
    MyTable
)
SELECT
    ID
FROM
    CTE
WHERE
    Ranking = 1

Редактировать, после комментария

Попробуйте что-то вроде ISNULL(PersonId, -ID) вместо PersonId, чтобы заставить его уникально различать каждый NULL Я использую -ID, чтобы он не конфликтовал, где ID = действительный PersonID

3 голосов
/ 26 ноября 2009

Вам понадобится запрос, который выглядит примерно так

SELECT  *
FROM    myTable t INNER JOIN
        (
            SELECT  PersonId, 
                    PayrollNum,
                    ContractId ,
                    MIN(PayrollFrom) MIN_PayrollFrom
            FROM    MyTable
            GROUP BY PersonId, 
                    PayrollNum,
                    ContractId
        ) minDates  ON t.PersonId = minDates.PersonId
                    AND  t.PayrollNum = minDates.PayrollNum
                    AND  t.ContractId = minDates.ContractId
                    AND  t.PayrollFrom = minDates.MIN_PayrollFrom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...