2017-08-29 9 views
1

重複しているとマークされていますが、リンクされた質問で少し説明されているようですが、私はまだ別々の列を取得しようとしていますDEBITCREDIT列同じ行にOracle SQL:自己結合表の各重複IDの最大レコードを取得する

私はビューを作成しました。私は現在それ自身で参加しています。私は各日付のための最大Header_IDを取得しようとしています。

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行)です:

私のSQLは、現在ある

Some rows

私はDEBITを取得するために、それ自体にテーブルを結合していますし、 CREDITと同じ行にあります。 BATCH_DATEごとに最大HEADER_IDの行のみを選択するにはどうすればよいですか? @sagi

については

更新

赤いボックスで強調それらは私が欲しいの行で、青いものは、私はフィルタリングてるものだろう。

enter image description here

固定間違い

私は最近、私は確信してTAB2 ACCT = '3648-00-0' を加えることなく、それ自体に私のテーブルに参加していた気づきました。

修正SQLはここにある:ROW_NUMBER()よう

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

使用ウィンドウ機能:

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) 

あなたの問題はさまざまな方法で解決されていますが、これは非常に効率的であり、テーブルを1回だけ使用します。

+0

お返事ありがとうございます!私は今それを試しに行くよ。前にPARTITION BYを使用していませんでした – spyr0

+0

ありがとう!私はそれが動作すると思います!私がbatch_idを見なかったので、しばらく混乱しました。 batch_dateに変更しました – spyr0

+0

ごめんなさい。選択されたクレジットも取り除かれているようです。 – spyr0

関連する問題