2012-01-17 3 views
0

FTEまたはPosition titleフィールドの違いがあるレコードのみを返します。フィールドデータに差異があるレコードのみを返します

フィールドemployee、job#、開始日FTEおよびポジションを持つ従業員データのテーブルがあります。各従業員との仕事のために私は唯一のクエリは、レコード1、3,4,6,8を返すべきFTEや位置

Record,Employee#,Job#,Start Date, FTE,Position 
1,  1000, 01, 01/01/2011, 100, A 
2,  1000, 01, 01/06/2011, 100, A 
3,  1000, 01, 01/07/2011, 80,  B 
4,  1000, 01, 01/08/2011, 80,  C 
5,  1000, 01, 01/10/2011, 80,  C 
6,  1000, 02, 01/01/2011, 20,  A 
7,  1000, 02, 01/05/2011, 20,  A 
8,  1000, 02, 01/08/2011, 20,  B 

の変化がある場合、レコードを返したいです。 (これらは唯一のレコードであり、FTEとPositionは前の行とは異なります)

+0

レコード1にはレコードがないため、最初のレコードを含める必要がありますか? – pistipanko

答えて

0

は、あなたが使用しているデータベースに依存します。 youreのは、Oracleを使用する場合はトリックを行う必要があり、次のサブクエリで

SELECT * 
FROM (
    SELECT 
    record 
    , employee# 
    , job# 
    , start_date 
    , fte 
    , LAG(fte) OVER (ORDER BY record) previous_row_fte 
    , position 
    , LAG(position) OVER (ORDER BY record) previous_row_position 
    FROM scott.stack_overflow_employee 
) 
WHERE fte != previous_row_fte 
OR position != previous_row_position 
OR previous_row_fte IS NULL 
OR previous_row_position IS NULL 

を使用すると、Oracleの分析関数LAGの使用を見ることができる - これに関する良い記事がhereを見つけることができます。この関数は、 'レコード'によって行を順序付けしてから、前の行fteまたはpositionを選択しています。外部クエリでは、WHERE句は、現在のfteが前の行fteと等しくないか、positionと同じでない場合にのみ行を返す条件を指定しています。さらに、oracleがNULL値を処理する方法のため、WHERE句の追加条件では、いずれかの値がNULLの場合も行が戻されます。

私は解決策を提供しましたが、なぜあなたがこれをやっているのか疑問を呈しています。もしあなたの解決策を満足させるためのより良い方法があれば、より大きなものに。あなたが何をしているかについてより多くの情報を提供できれば、もっと良い解決策に達するかもしれません。

0

これは典型的な自己結合シナリオのように見えます。テーブルを再度照会し、別のFTEまたはポジション。

このような何か(いいえ、私はこれを試していない):

select later.* 
from 
    my_table as later, 
    my_table as earlier -- same table again 
where 
    later.employee = earlier.employee -- the self-join 
    and 
    later.date > earlier.date -- lest we see changes twice 
    and 
    later.FTE != earlier.FTE -- the change 
; 
関連する問題