如何仅在sql中选择唯一行?
我在Messages表中有两列,senderUserID和receiveUserID。 我选择senderUserID和ReceiveUserID,当前接收者在过去向当前发送者发送消息。我每次只选择10行,但有时在此表中,当我需要唯一的senderUserID时,senderUserID会多次出现,而ReceiveUserId可以返回任意次数 这是示例数据如何仅在sql中选择唯一行?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在Messages表中有两列,senderUserID和receiveUserID。 我选择senderUserID和ReceiveUserID,当前接收者在过去向当前发送者发送消息。我每次只选择10行,但有时在此表中,当我需要唯一的senderUserID时,senderUserID会多次出现,而ReceiveUserId可以返回任意次数 这是示例数据 66622 61350 90166 79222 90176 79222 86727 80452 10888 47305
66622 61350
90166 79222
90176 79222
86727 80452
10888 47305
66560 79219
66622 80452
89548 14452
66622 69177
52081 79223
如您所见,66622在senderUserID中出现了两次。如何将其限制为仅显示一次
谢谢我想说的是忽略任何重复的。这将为每个批处理提供不到10个结果,但我更喜欢通过在数据库上分组来实现唯一性(可能会很昂贵)。这里的目标是最大化消息吞吐量,对吗 如果仍要在SQL中执行此操作,请执行以下操作:
select senderUserId, max(receiverUserId) from messages group by senderUserId
对于此senderUserId,您希望看到两个接收者中的哪一个?您的答案比我的好:)@Thilo,此查询每天应请求运行几次,因此我不太担心IO或内存使用情况。@Thilo,我反对低IDs而不是max。您可以使用列表功能:选择senderUserId,列表(receiverUserId)从消息组按1查看工作。如果eugeneK只想选择10条记录,他应该将最后一行更改为:选择前10个senderUserID,从cte接收用户ID,其中RN=1thanks@Martin Smith。。。Thilo的查询在我的数据集上运行得更快,即使您的解决方案很好。。。
;WITH cte AS
(
SELECT senderUserID,
recieverUserID,
ROW_NUMBER() OVER (PARTITION BY senderUserID ORDER BY recieverUserID) AS RN
FROM YourTable
)
SELECT senderUserID,recieverUserID FROM cte
WHERE RN=1