2

以下のレコード セットごとに、3 つの列があり、PersonId のすべてのセットの最大 CaseId 値を返す必要があります。

ID    PersonId  CaseId
66    30        410
1681  30        3508
226   31        958
856   31        2213
1023  31        2400

たとえば、次のようなレコードセットを返したいと思います。

ID    PersonId  CaseId
1681  30        3508
1023  31        2400

ご覧のとおり、PersonId のすべてのセットに対して常に最大 CaseId を返しています。

私は次のことを試しましたが、常に最大レコードを返すとは限りません:

WITH latestRecord AS
 (
  SELECT  CaseId, PersonId, ID,
    ROW_NUMBER() OVER (PARTITION BY PersonId ORDER BY ID ASC) AS RN
  FROM    Employee
  )
  SELECT  Max(RN),CaseId, PersonId
  FROM    latestRecord
  GROUP BY RN,CaseId, PersonId
  --WHERE   RN > 1
  ORDER BY CaseId

ご協力いただきありがとうございます!

4

3 に答える 3

3

あなたはそれをほぼ正しかった:

WITH latestRecord
AS
(
    SELECT  CaseId, 
            PersonId, 
            ID,
            RN=ROW_NUMBER() OVER (PARTITION BY PersonId ORDER BY CaseId DESC) 
    FROM    Employee
)
SELECT  CaseId, 
        PersonId, 
        ID
FROM    latestRecord
WHERE   RN = 1
ORDER BY CaseId
于 2013-08-16T21:27:48.103 に答える
1

サブクエリを使用して、PersonId の各セットの最大 CaseId 値を見つけることもできます。

SELECT *
FROM dbo.Employee t
  JOIN (
        SELECT PersonId, MAX(CaseId) AS CaseId
        FROM dbo.Employee
        GROUP BY PersonId
        ) t2 ON t.PersonId = t2.PersonId AND t.CaseId = t2.CaseId

パフォーマンスを改善するには、次のインデックスを使用します。

CREATE INDEX x ON dbo.Employee(PersonId, CaseId) INCLUDE(ID)

ここに画像の説明を入力

デモを見るSQLFiddle

于 2013-08-17T07:37:52.873 に答える