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

ごめんなタイトルは申し訳ありません。
私が必要としているのは、Ef Feeという名前の請求書に対して、各ユーザーのMAX(PaymentDue)を取得することです。次に、選択された行に基づいてPaymentMadeの値(通常は他の列)を取得する必要があります。行のためにPurchaseIdを得ることができればいいですが、必須ではありません。これまで私がこれまでやってきたやり方は、複数のCTEにあります。 UserId, InvoiceName, MAX(PaymentDue)をつかんで、3つすべてのデータを取得して、必要な他のデータを取得しますが、複数のcteを使用せずにこれを達成するためのより良い/より速い方法があるのだろうかと思います。最大値に基づいて行から他のデータを取得

最新のPaymentDueであるため、結果が3行になります。

EDIT:

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

答えて

2

私はここにrow_numberを使用して一つの選択肢だ、正しくあなたの質問を理解してると仮定:文句を言わないCTEまたは派生テーブルを使用

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

もう一つのアプローチ...

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