2017-04-06 11 views
0

と接合Iは、各契約でatrasoの最大値を見つけることが、私は、contrato I群ためcontratoによって、またNUM_PARCELAを抽出することができません。
num_parcela,max_atrasoを抽出する提案はどれですか?contrato?私は必要なものSQL SELECT 3つの同じテーブルから最大行と行とseсondテーブル

Select 
    a.[CONTRATO] 
    ,a.[NUM_PARCELA] 
    ,a.[DATA_PAGAMENTO] 
    ,a.[DATA_VENCTO] 
    ,b.[DATA_LIBER_CONTRATO] 
    ,DATEDIFF(day, a.DATA_VENCTO, a.DATA_PAGAMENTO) as ATRASO 
INTO #temp1 
    from [fprisco].[dbo].[ParcelasGrc2] as a 
inner join [fprisco].[dbo].[ContratosGrc2] as b  
on b.contrato=a.contrato 
where b.data_liber_contrato >'2017-02-28 00:00:00.000' 

Select  
    contrato, 
    max(atraso) as Max_Atraso   
    from #temp1  
group by contrato 
order by contrato desc 

は、各contratoの最大atrasoであり、また、最大atrasoているnum_parcelaマッチを取ります。 Num_Parcelaには、契約ごとに複数のレコードがあり、一致するレコードは最大でatrasoです。

+0

サンプルデータと望ましい結果は、ここでより有用 –

+2

なり始めるには絶好の場所です。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

0

あり、それを行うにはどのように多くの方法があり、怒鳴るそれらの2を参照してください。

テストケース:

DECLARE @temp1 TABLE (contrato int, atraso int, num_parcela int) 

INSERT INTO @temp1 VALUES (1,5,1) 
INSERT INTO @temp1 VALUES (1,4,2) 
INSERT INTO @temp1 VALUES (1,3,3) 
INSERT INTO @temp1 VALUES (2,2,1) 
INSERT INTO @temp1 VALUES (2,3,1) 
INSERT INTO @temp1 VALUES (2,4,2) 

でグループとの最初の変種と元のテーブルに

;WITH MaxAtraso AS (
    Select  
     contrato, 
     max(atraso) as Max_Atraso 
    from @temp1  
    group by contrato 
) 
SELECT m.*, t.num_parcela FROM MaxAtraso m 
JOIN @temp1 t 
ON m.Max_Atraso = t.atraso AND m.contrato = t.contrato 
ORDER BY contrato DESC 
に参加します

ROW_NUMBER()を使用した順序付きリストの第2変形例:

;WITH OrderByAtraso AS (
    Select  
     contrato, 
     num_parcela, 
     atraso, 
     ROW_NUMBER() OVER (PARTITION BY contrato ORDER BY atraso DESC) rn 
    from @temp1  
) 
SELECT * FROM OrderByAtraso WHERE RN=1 ORDER BY contrato DESC 

はまた、ちょうどこの操作のために一時テーブルを作成する必要はありません、あなたは次のように書き換えることができます。

;WITH OrderByAtraso AS (
Select 
    a.[CONTRATO] 
    ,a.[NUM_PARCELA] 
    ,a.[DATA_PAGAMENTO] 
    ,a.[DATA_VENCTO] 
    ,b.[DATA_LIBER_CONTRATO] 
    ,DATEDIFF(day, a.DATA_VENCTO, a.DATA_PAGAMENTO) as ATRASO 
    ,ROW_NUMBER() OVER (
     PARTITION BY contrato 
     ORDER BY DATEDIFF(day, a.DATA_VENCTO, a.DATA_PAGAMENTO) DESC) RN 
from [fprisco].[dbo].[ParcelasGrc2] as a 
inner join [fprisco].[dbo].[ContratosGrc2] as b  
on b.contrato=a.contrato 
where b.data_liber_contrato >'20170228' 
) 
SELECT contrato, atraso as MaxAtraso, num_parcela 
FROM OrderByAtraso WHERE RN=1 ORDER BY CONTRATO DESC 
関連する問題