基于多个参数检索唯一行

时间:2016-09-21 12:53:03

标签: sql sql-server sql-server-2012

这可能很简单但我似乎缺乏通过搜索引擎来表达这个问题的正确方法。

对于给定的TicketId,有基于LocId和BinId的唯一标识符。对于任何给定的LocId + BinId组合,也可以有任意数量的TransIds。

我需要的是只返回TransId最高的记录。

TicketId | LocId | BinId | TransId
-------- | ----- | ----- | -------
316      | 111   | 100   | 1000
316      | 112   | 101   | 1001
316      | 113   | 105   | 1000
316      | 104   | 210   | 1001
316      | 104   | 210   | 1000
316      | 17    | 35    | 1000
316      | 17    | 35    | 1001
316      | 27    | 99    | 1001       

所以我的预期结果将是:

TicketId | LocId | BinId | TransId
-------- | ----- | ----- | -------
316      | 111   | 100   | 1000
316      | 112   | 101   | 1001
316      | 113   | 105   | 1000
316      | 104   | 210   | 1001
316      | 17    | 35    | 1001
316      | 27    | 99    | 1001

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER()PARTITIONLocId的窗口BinId功能执行此操作,TransId DESC排序,并只取得第一个结果:

;With Cte As
(
    Select  *,
            Row_Number() Over (Partition By LocId, BinId Order By TransId Desc) As RN
    From    YourTable
)
Select  TicketId, LocId, BinId, TransId
From    Cte
Where   RN = 1

答案 1 :(得分:1)

我错过了什么,似乎GROUP BY可以做到这一点吗?

SELECT TicketId, LocId, BinId, MAX(TransId)
FROM Table
GROUP BY TicketId, LocId, BinId

您提到了给定的TicketId,一个带有WHERE语句的示例。

SELECT TicketId, LocId, BinId, MAX(TransId)
FROM Table
WHERE TicketId = 316
GROUP BY TicketId, LocId, BinId