SQL Server - 一列中的不同情况,但第二列中的最后一条记录

时间:2016-04-18 11:48:00

标签: sql-server

我有一个要求(简单,但无法找到简单的解决方案)来获取手机号码和唯一的交易ID(最新的交易会很好,但任何交易ID也都可以)

示例数据

Seq.    Mobile No.      Transaction No.
1       1234567890        ABC1234
2       2345678901        ABC2392
3       2345678901        ABC2782

我只是想找到手机号码2345678901以及任何一笔交易,不过最新款会很好。

输出

Seq.    Mobile No.      Transaction No.
1       1234567890        ABC1234
2       2345678901        ABC2782

我知道简单的DISTINCT不会工作,所以不确定什么是获得结果的最佳方法。

我找到了一种通过子查询来实现的方法,但我希望在单个查询中实现它以获得更好的性能。

Plz帮助!!

3 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER

SELECT Seq, MobileNo, TransactionNo
FROM (
  SELECT Seq, MobileNo, TransactionNo,
         ROW_NUMBER() OVER (PARTITION BY MobileNo ORDER BY Seq DESC) AS rn
  FROM mytable) AS t
WHERE t.rn = 1 

上述查询将按MobileNo选择一条记录:Seq值最大的记录。

答案 1 :(得分:0)

您可以使用group by

select [Seq], [Mobile No], [Transaction No] from yourtable t1 
inner join 
(select [Mobile No], max([Transaction No]) as T_no from yourtable
group by [Mobile No]) t2 
on  t1.[Mobile No]=t2.[Mobile No] and t1.[Transaction No]=t2.T_no

正确的查询为您提供每[Transaction No]的最新[Mobile No],而左查询仅用于查找匹配的[Seq]

答案 2 :(得分:0)

CREATE TABLE #Transaction
(
    Seq VARCHAR(12),
    MobileNo VARCHAR(12),
    TransactionNo VARCHAR(12)
)

INSERT INTO #Transaction VALUES
 (1,'1234567890','ABC1234')
,(2,'2345678901','ABC2392')
,(3,'2345678901','ABC2782')

    SELECT DT.Seq,DT.MobileNo,DT.TransactionNo FROM
        (SELECT Seq,
               MobileNo,
               TransactionNo,
               ROW_NUMBER() OVER(PARTITION BY MobileNo ORDER BY Seq) AS Rn
         FROM
         #Transaction) DT
    WHERE DT.Rn = 1