需要一些SQL查询的帮助

j.s*_*ell 2 sql t-sql sql-server sql-server-2005

我需要一些SQL Server 2005 SQL查询的帮助.以下是要查询的表中数据的示例:

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为每个分组日期.我不确定如何更好地解释它?希望您可以查看输出以帮助理解查询的要求.

让我知道我是否需要更好地解释这一点(或者如果你认为你理解它并且可以更好地解释它,请这样做).

谢谢你的帮助,詹姆斯.

gbn*_*gbn 9

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
Run Code Online (Sandbox Code Playgroud)

评论后编辑

尝试类似的东西,ISNULL(PersonId, -ID)而不是PersonId强制它唯一区分每个NULL.我使用-ID它不应该在ID =有效PersonID的地方发生冲突