1

我正在查询一个名为 PhoneCallNotes 的表。每次通话都会记录来电者的 FirstName、LastName 和 DOB 以及许多其他字段,包括通话的唯一 ID (PhoneNoteID),但没有来电者的唯一 ID。我的要求是从他们最近的条目中返回一个删除重复的呼叫者列表以及 PhoneNoteID 等。我可以使用名称、DOB 和 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 组合的每个电话呼叫记录,其中没有最近的行(b为空)。但是,如果您有两行具有相同的创建时间,则会得到重复的行。

于 2012-04-09T20:08:04.090 回答