2016-04-18 4 views
2

Ich habe eine Anforderung (einfach, kann aber keine einfache Lösung finden), Handy-Nummer und eindeutige Transaktions-ID abzurufen (neueste Transaktion wäre gut, aber jede Transaktion ID ist auch ok)SQL Server - Eindeutiger Fall in einer Spalte, aber letzter Eintrag in der zweiten Spalte

Beispieldaten

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

ich einfach will Handy-Nummer 2345678901 und das jeweils eine Transaktion finden, spätestens jedoch gut sein würde.

Ausgabe

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

weiß, dass ich einfach DISTINCT wird nicht funktionieren, so dass nicht sicher, was der beste Weg ist, um das Ergebnis zu erhalten.

Ich habe einen Weg gefunden, es über Sub-Abfrage zu tun, aber ich möchte es in Einzelabfrage für bessere Leistung zu tun.

PLZ Hilfe !!

Antwort

3

Sie können ROW_NUMBER für diesen Einsatz:

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 

Die obige Abfrage genau einen Datensatz pro MobileNo abholt: die eine der größten Seq Wert.

0

Sie können group by verwenden.

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 

rechtse Abfrage gibt Ihnen neueste [Transaction No] pro [Mobile No] und linke Abfrage verwendet wird nur für die Suche nach [Seq] entsprechen.

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 
Verwandte Themen