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

时间:2017-08-29 13:53:01

标签: sql oracle greatest-n-per-group

它被标记为重复,似乎在链接的问题中有一点解释,但我仍然试图在同一行上获得单独的DEBITCREDIT列。

我创建了一个视图,我目前正在加入它。我正在尝试获取每个日期的最大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_ID个最大BATCH_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

1 个答案:

答案 0 :(得分:1)

使用像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)

它比连接更有效率(你的问题可以通过多种方式解决),并且只使用一次表。