2016-07-25 9 views
0
CREATE TABLE #TmpTbl 
(
PurchaseId INT 
,UserID INT 
,InvoiceName VARCHAR(20) 
,PaymentDue DATE 
,PaymentMade DATE 
) 

INSERT INTO #TmpTbl 
    SELECT 1 
      ,1 
      ,'Ef Fee' 
      ,'2016-01-01' 
      ,'2016-01-02' 
    UNION ALL 
    SELECT 2 
      ,1 
      ,'Monthly Pmt' 
      ,'2016-05-01' 
      ,'2016-05-02' 
    UNION ALL 
    SELECT 3 
      ,1 
      ,'Ef Fee' 
      ,'2016-07-26' 
      ,NULL 

PurchaseId UserID InvoiceName PaymentDue PaymentMade 
    1   1  EF Fee   2016-01-01 2016-01-02 
    2   1  Monthly Pmt 2016-05-01 2016-05-02 
    3   1  EF Fee   2016-07-26 NULL 

Sorry für den beschissenen Titel.
Was ich brauche, ist die MAX(PaymentDue) für jeden Benutzer zu erhalten, für Rechnungen, die Ef Fee genannt werden. Dann muss ich den PaymentMade Wert (und normalerweise einige andere Spalten) basierend auf welcher Zeile ausgewählt wird. Es wäre schön, in der Lage zu sein, die PurchaseId für die Zeile zu bekommen, aber nicht erforderlich. Die Art, wie ich das in der Vergangenheit gemacht habe, ist mit mehreren CTE's. Ergreifen Sie die UserId, InvoiceName, MAX(PaymentDue) dann wieder auf alle 3, um die anderen benötigten Daten zu greifen, aber ich frage mich, ob es eine bessere/schnellere Möglichkeit gibt, dies zu erreichen, ohne mehrere Cte's zu verwenden.Weitere Daten aus Zeile basierend auf Max. Wert

Gewünschtes Ergebnis wäre Zeile 3, weil es das neueste PaymentDue ist.

EDIT:

PurchaseId UserID InvoiceName PaymentDue PaymentMade 
    3   1  EF Fee   2016-07-26 NULL 

Antwort

2

verstehe ich Ihre Frage richtig Unter der Annahme, hier ist eine Option row_number:

select * 
from (
    select *, row_number() over (partition by userid order by paymentdue desc) rn 
    from #TmpTbl 
    where invoicename = 'EF Fee' 
) t 
where rn = 1 
+0

Danke! Das scheint so zu funktionieren, wie ich es brauche! – Doolius

0

Ein weiterer Ansatz, der gewohnt CTE verwenden oder eine abgeleitete Tabelle ..

select top 1 with ties 
PurchaseId , 
    UserID , 
InvoiceName, 
PaymentDue, 
PaymentMade 
from 
table 
order by 
Row_number() over (partition by userid order by purchase due desc) 
Verwandte Themen