0

次のスキーマがあります

Invoices
=================
invoice_number
account_id
invoice_amount
invoice_date
status ("Paid","Not Paid")

次の情報を含むすべての請求書を取得するクエリを作成しようとしています...

  • 請求書番号
  • 請求書の日付
  • アカウントID
  • 請求金額
  • このアカウント ID の最後の支払い済み請求額 (この行の請求日より前)

最後のアイテム (前回の支払済み請求書の金額) に問題があります。これまでのところ...

select 
inv2.invoice_number,
inv2.invoice_date,
inv2.account_id,
inv2.invoice_amount,
(
select * from (
    select inv.invoice_amount
      from invoices inv
      where inv.account_id = inv2.account_id
      and inv.status = 'PAID'
      and inv.invoice_date < inv2.invoice_date
      order by inv.invoice_date desc
    )
where rownum <=1
) as last_paid_amount
from
invoices inv2

データセットのサイズが非常に高くつくため、相関サブクエリを使用しないようにこれをリファクタリングしようとしています。非相関サブクエリを使用するようにリファクタリングするにはどうすればよいですか。これは可能ですか?

ありがとうございました

4

2 に答える 2

1

今はテストする機会がないので、おそらくここで句を台無しにしましorder byたが、アイデアは LAG 関数を使用することにあります。

select 
  inv2.invoice_number,
  inv2.invoice_date,
  inv2.account_id,
  inv2.invoice_amount,
  lag(invoice_amount) over(
    partiton by account_id 
    order by invoice_date, decode(status, 'PAID', 1, 0)  
  ) last_paid_amount
from
invoices inv2
于 2012-09-28T05:12:40.600 に答える