2016-07-25 152 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 

對不起,這個蹩腳的標題。
我需要的是爲每個用戶獲取MAX(PaymentDue),以獲取名爲Ef Fee的發票。然後,我需要根據所選行選擇PaymentMade值(通常是其他一些列)。能夠獲得行的PurchaseId會很好,但不是必需的。我過去的做法是使用多個CTE。抓住UserId, InvoiceName, MAX(PaymentDue),然後匹配所有3來獲取所需的其他數據,但我想知道是否有更好/更快的方法來實現這一點,而不必使用多個cte。根據最大值從行中獲取其他數據

期望的結果將是第3行,因爲它是最近的PaymentDue

編輯:

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

回答

2

假設我正確理解你的問題,這是一個使用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

謝謝!這看起來像我需要的一樣工作! – Doolius

0

還有一個的做法,不會使用CTE或派生表..

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)