Oracle SQL:为自身连接表中的每个重复ID获取最大记录

问题描述:

它已被标记为重复项,似乎在链接的问题中有所解释,但我仍尝试获取单独的DEBITCREDIT列在同一行。Oracle SQL:为自身连接表中的每个重复ID获取最大记录

我创建了一个视图,我目前正在自我加入。我试图获得每个日期的最大Header_ID。

我的SQL是目前:

SELECT DISTINCT 
TAB1.id, 
TAB1.glperiods_id, 
MAX(TAB2.HEADER_ID), 
TAB1.batch_date, 
TAB1.debit, 
TAB2.credit, 
TAB1.descrip 

FROM 
IQMS.V_TEST_GLBATCH_GJ TAB1 

LEFT OUTER JOIN 
IQMS.V_TEST_GLBATCH_GJ TAB2 
ON 
TAB1.ID = TAB2.ID AND TAB1.BATCH_DATE = TAB2.BATCH_DATE AND TAB1.GLPERIODS_ID = TAB2.GLPERIODS_ID AND TAB1.DESCRIP = TAB2.DESCRIP AND TAB1.DEBIT <> TAB2.CREDIT 

WHERE 
TAB1.ACCT = '3648-00-0' 
AND 
TAB1.DESCRIP NOT LIKE '%INV%' 
AND TAB1.DEBIT IS NOT NULL 

GROUP BY 
TAB1.id, 
TAB1.glperiods_id, 
TAB1.batch_date, 
TAB1.debit, 
TAB2.credit, 
TAB1.descrip 

ORDER BY TAB1.batch_date 

和输出因为这是(共37行):

Some rows

我加入到表本身获得DEBITCREDIT在同一行上。如何仅选择最大HEADER_IDBATCH_DATE的行?

更新

对于@sagi

那些用红框强调是我想要的行和蓝色是我过滤掉的那些的人。

enter image description here

修正错误

我最近发现我已经加入我的桌子上本身没有确保TAB2 ACCT = '3648-00-0'。

修正SQL是在这里:

SELECT DISTINCT 
TAB1.id, 
TAB1.glperiods_id, 
Tab1.HEADER_ID, 
TAB1.batch_date, 
TAB1.debit, 
TAB2.credit, 
TAB1.descrip 

FROM 
IQMS.V_TEST_GLBATCH_GJ TAB1 

LEFT OUTER JOIN 
IQMS.V_TEST_GLBATCH_GJ TAB2 
ON 
TAB1.ID = TAB2.ID AND TAB1.BATCH_DATE = TAB2.BATCH_DATE AND TAB2.ACCT ='3648-00-0'AND TAB1.GLPERIODS_ID = TAB2.GLPERIODS_ID AND TAB1.DESCRIP = TAB2.DESCRIP AND TAB1.DEBIT <> TAB2.CREDIT 

WHERE 
TAB1.ACCT = '3648-00-0' 
AND 
TAB1.DESCRIP NOT LIKE '%INV%' 
AND TAB1.DEBIT IS NOT NULL 

ORDER BY TAB1.BATCH_DATE 

使用窗口函数像ROW_NUMBER()

SELECT s.* FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.batch_id ORDER BY t.header_id DESC) as rnk 
    FROM YourTable t 
    WHERE t.ACCT = '3648-00-0' 
     AND t.DESCRIP NOT LIKE '%INV%' 
     AND t.DEBIT IS NOT NULL) s 
WHERE s.rnk = 1 

这是由OVER子句中提供的值排名您记录的解析函数。

PARTITION - is the group 
ORDER BY - Who's the first of this group (first gets 1, second 2, ETC) 

这是一个更有效率然后连接(您的问题可能已被解决在很多方面),并只使用一次表。

+0

感谢您的回复!我现在要试一试。在 – spyr0

+0

之前没有使用PARTITION BY谢谢!我认为它的作品!困惑了一会儿,因为我没有看到batch_id。将其更改为batch_date – spyr0

+0

无需等待对不起。它似乎也摆脱了选定的信贷。 – spyr0