2017-08-20 8 views
1

Oracle SQLを学習しています。Oracle SQL - 同じ行の値間の差分を取得する方法、一意のIDなし

特定の製品の購入/返品の各取引間の時間を決定する必要があります。

データのサンプルを以下に示します。ただし、購入と返品を結ぶ一意の取引識別子はありませんが、購入直後の返品(トランザクション時間に基づく)は同じ取引であると仮定できます。

この問題を解決する方法を教えてください。サンプルのSQLステートメントは非常に高く評価されます。

Product TransactionType TransactionTime 
A  PURCHASE   18-Aug-17 10.15.56.000000 AM 
A  RETURN   18-Aug-17 10.30.21.000000 AM 
A  PURCHASE   18-Aug-17 11.10.35.000000 AM 
A  RETURN   18-Aug-17 11.12.52.000000 AM 
B  PURCHASE   18-Aug-17 10.15.56.000000 AM 
B  RETURN   18-Aug-17 10.22.56.000000 AM 
B  PURCHASE   18-Aug-17 10.30.21.000000 AM 
B  RETURN   18-Aug-17 10.31.21.000000 AM 
+1

あなたにも予想される出力を表示することができますか? –

+1

問題が単純すぎる可能性があります。購入されたすべての商品が必ず返品されるとは限りません。したがって、表はproduct = Aおよびtype = PURCHASEの50行、product = Aおよびtype = RETURNの3行しか持たないはずです。おそらく、それぞれのRETURNについて、対応するPURCHASEがその直前のものであると仮定することができます。 (これは、RETURNを含む連続した行が存在しないことも前提としています。これは実際の生活では簡単に起こります)なぜトランザクションにトランザクションIDがないのですか? – mathguy

答えて

1

あなたはlead()を使用することができます。

select t.*, 
     (next_ttime - transactiontime) as time_to_return 
from (select t.*, 
      lead(transactiontype) over (partition by product order by transactiontime) as next_ttype, 
      lead(transactiontime) over (partition by product order by transactiontime) as next_ttime 
     from t 
    ) t 
where transactiontype = 'PURCHASE' and 
     next_ttype = 'RETURN' 
関連する問題