我需要一些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
解释:我基本上需要的是PersonId
,PayrollNum
和ContractId
不同的记录的唯一身份验证值,也是PayrollFrom
的最低{1}}日期每个分组。我不确定如何更好地解释它?希望您可以查看输出以帮助理解查询的要求。
如果我需要更好地解释这一点(或者如果你认为你理解它并且可以更好地解释它,请告诉我)。
感谢您的帮助, 詹姆斯。
答案 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