2017-04-06 31 views
0

我發現每個合同的最大atraso,但是我不能提取NUM_PARCELA,因爲我按contrato分組。
任何建議提取num_parcela,max_atraso每個contratoSQL從同一表中選擇三行並加上一個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,並採取哪些num_parcela與最大atraso匹配。 Num_Parcela有每個合約的多個記錄,並且只有一個匹配的最大值爲atraso

+0

樣本數據和預期的結果將是更有幫助 –

+2

這裏是一個偉大的地方開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

回答

0

有更多的方式該怎麼辦呢,看到他們兩個波紋管:

測試用例:

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()有序列表的第二個變體變體:

;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 
相關問題