簡體   English   中英

SQL從同一表中選擇具有最大行的三行,然后與第二個表聯接

[英]SQL Select three rows with a max row from same table and joining with a second table

我覺得最大的atraso每個合同,但我也不能提取NUM_PARCELA ,只有contrato通過,因為我組contrato
任何建議,以提取num_parcelamax_atraso每個contrato

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 

我需要的是最大atraso每個contrato ,並采取哪些num_parcela與最大匹配atraso Num_Parcela具有每個合同的多個記錄,並且只有一個具有最大atraso匹配atraso

有更多方法可以執行此操作,請參見以下兩種方法:

測試用例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM