Oracle SQL:为自身连接表中的每个重复ID获取最大记录
问题描述:
它已被标记为重复项,似乎在链接的问题中有所解释,但我仍尝试获取单独的DEBIT
和CREDIT
列在同一行。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行):
我加入到表本身获得DEBIT
和CREDIT
在同一行上。如何仅选择最大HEADER_ID
每BATCH_DATE
的行?
更新
对于@sagi
那些用红框强调是我想要的行和蓝色是我过滤掉的那些的人。
修正错误
我最近发现我已经加入我的桌子上本身没有确保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)
这是一个更有效率然后连接(您的问题可能已被解决在很多方面),并只使用一次表。
感谢您的回复!我现在要试一试。在 – spyr0
之前没有使用PARTITION BY谢谢!我认为它的作品!困惑了一会儿,因为我没有看到batch_id。将其更改为batch_date – spyr0
无需等待对不起。它似乎也摆脱了选定的信贷。 – spyr0