2016-07-25 234 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)