2016-04-18 11 views
2

モバイル番号と一意のトランザクションIDを取得する要件(シンプルですが単純な解決策が見つからない) IDは、しかし、最新のが良いでしょう、私は単純に携帯電話番号2345678901と1つのトランザクションのいずれかを見つけたいSQL Server - 1つの列の最後のレコードが2番目の列の最後のレコード

サンプルデータ

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

)もokです。

出力

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

私は単にDISTINCTは結果を取得するための最良の方法だかわから動作し、そうではないではないことを知っています。

サブクエリを使用して行う方法が見つかりましたが、パフォーマンスを向上させるために単一クエリで実行したいと考えています。

Plzヘルプ!

答えて

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ごとに1つのレコードを選択します:最大Seq値を有するものを。

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 

右のクエリはあなたに最新の与え[Mobile No]あたり[Transaction No]と左のクエリが[Seq]をマッチング見つけるためにのみ使用されます。

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 
関連する問題