1

PhoneCallNotes という 1 つのテーブルに対してクエリを実行しています。発信者の FirstName、LastName、および DOB は、通話ごとに記録されます。また、通話の一意の ID (PhoneNoteID) を含む他の多くのフィールドが記録されますが、発信者の一意の ID は記録されません。私の要件は、最新のエントリから PhoneNoteID などとともに重複が削除された発信者のリストを返すことです。名前、生年月日、および Max(CreatedOn) で Group By を使用して必要なユーザーのリストを取得できますが、(結果の最新のエントリの) uniqueID を含めるにはどうすればよいですか?

select  O.CallerFName,O.CallerLName,O.CallerDOB,Max(O.CreatedOn)
from [dbo].[PhoneCallNotes] as O
where O.CallerLName like 'Public'
group by O.CallerFName,O.CallerLName,O.CallerDOB order by Max(O.CreatedOn) 

結果:

John    Public  4/4/2001    4/6/12 16:42
Joe     Public  4/12/1988   4/6/12 16:52
John    Public  1/2/1950    4/6/12 17:01

ありがとう

4

3 に答える 3

3

TOP (1) WITH TIES を選択し、ROW_NUMBER() 式を ORDER BY 句に入れると、Andrey が書いたものをもう少しコンパクトに書くこともできます。

SELECT TOP (1) WITH TIES
  CallerFName,
  CallerLName,
  CallerDOB,
  CreatedOn,
  PhoneNoteID
FROM [dbo].[PhoneCallNotes]
WHERE CallerLName = 'Public' 
ORDER BY ROW_NUMBER() OVER(
  PARTITION BY CallerFName, CallerLName, CallerDOB
  ORDER BY CreatedOn DESC
)

(ちなみに、単純な文字列比較に LIKE を使用する理由はありません。)

于 2012-04-09T20:19:42.197 に答える
2

そのようなことを試してください:

;WITH CTE AS (
    SELECT  
        O.CallerFName,
        O.CallerLName,
        O.CallerDOB,
        O.CreatedOn,
        PhoneNoteID,
        ROW_NUMBER() OVER(PARTITION BY O.CallerFName, O.CallerLName, O.CallerDOB ORDER BY O.CreatedOn DESC) AS rn
    FROM [dbo].[PhoneCallNotes] AS O 
    WHERE 
        O.CallerLName LIKE 'Public' 

)
SELECT 
    CallerFName,
    CallerLName,
    CallerDOB,
    CreatedOn,
    PhoneNoteID
FROM CTE
WHERE rn = 1
ORDER BY 
    CreatedOn 
于 2012-04-09T20:10:28.130 に答える
0

FirstName[ 、、 ]のセットが一意LastNameであると仮定するとDateOfBirth(#shudder#)、ほとんどすべての主要なRDBMSで次のことが機能するはずです。

SELECT a.callerFName, a.callerLName, a.callerDOB, a.createdOn, a.phoneNoteId
FROM phoneCallNotes as a
LEFT JOIN phoneCallNotes as b
ON b.callerFName = a.callerFName
AND b.callerLName = a.callerLName
AND b.callerDOB = a.callerDOB
AND b.createdOn > a.createdOn
WHERE a.callerLName LIKE 'Public'
AND b.phoneNoteId IS NULL

基本的に、クエリは特定の名前/ dobの組み合わせについて、すべての電話メモを検索します。ここでは、最近の行はありません(bnull)。ただし、作成時間が同じ2つの行がある場合は、重複する行が取得されます。

于 2012-04-09T20:08:04.090 に答える