我有一个要求(简单,但无法找到简单的解决方案)来获取手机号码和唯一的交易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帮助!!
答案 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