需要一些SQL查询的帮助

时间:2009-11-26 11:35:26

标签: sql sql-server sql-server-2005 tsql

我需要一些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

解释:我基本上需要的是PersonIdPayrollNumContractId不同的记录的唯一身份验证值,也是PayrollFrom的最低{1}}日期每个分组。我不确定如何更好地解释它?希望您可以查看输出以帮助理解查询的要求。

如果我需要更好地解释这一点(或者如果你认为你理解它并且可以更好地解释它,请告诉我)。

感谢您的帮助, 詹姆斯。

2 个答案:

答案 0 :(得分: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

评论后编辑

尝试使用ISNULL(PersonId, -ID)而不是PersonId来强制它区分每个NULL。我使用-ID它不应该在ID =有效PersonID

的地方发生冲突

答案 1 :(得分:3)

您需要一个类似于此内容的查询

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