2016-03-21 5 views
-1

私は今、私はそれがmax(effective_end_date)として31-DEC-4712を持っている必要があることをeffective_start_dateとeffective_End_dateを持つすべてのこれらの特定の従業員のためにチェックしたいテーブルtab_assignment_xxeffective_end_dateない31 - 12月 - 4712

date_from date_end  action person_number 
01-Apr-2014 31-Jul-2014 HIRE 050498 
01-Aug-2014 31-Jan-2015 OTHERS 050498 
01-Feb-2015 30-Jun-2015 OTHERS 050498 
01-Jul-2015 15-Nov-2015 OTHERS 050498 
16-Nov-2015 31-Dec-2015 OTHERS 050498 
01-Jan-2016 30-JAN-2016 OTHERS 050498 

01-APR-2016 31-JUL-2016 hire 83982 
01-jan-2015 31-dec-4712 Others 6447 

を持っていますたとえば、050498の場合、max(effective_end_date)は'31 -dec-4712 'ではなく、83982の場合も同じです。6447は正しいです。このため

私が作っ:

select * from (
    select T.*, 
     max(EFFECTIVE_START_DATE) over (partition by PERSON_NUMBER order by EFFECTIVE_START_DATE) MAX_FROM 
    from tab_assignment_xx T 
    where 1=1 
    --T.PERSON_NUMBER = '093343' 
    AND ASSIGNMENT_TYPE='E' 
) 
    where MAX_FROM <> to_date('31-DEC-4712') 
; 

しかし、これは、それは、行31 - 12月 - 4712最大EFF終了日とし、なしの両方

+0

エラーが表示されますか?期待どおりの結果セットがありませんか?どのように動作していないのかを具体的に記述します。 –

+0

「うまくいかない」というのは本当に役に立たない、間違った結果セットを返すか? 'RANGE UNBOUNDED PRECEDING'デフォルトになる' EFFECTIVE_START_DATEによる注文 'を削除してください。 – dnoeth

+0

ありがとうございました:) 更新しました。 31-dec-4712なしでも両方のレコードを返す –

答えて

0

Oracleのセットアップであるという意味で動作していません:

CREATE TABLE table_name (date_from, date_end, action, person_number) AS 
SELECT DATE '2014-04-01', DATE '2014-07-31', 'HIRE', '050498' FROM DUAL UNION ALL 
SELECT DATE '2014-08-01', DATE '2015-01-31', 'OTHERS', '050498' FROM DUAL UNION ALL 
SELECT DATE '2015-02-01', DATE '2015-06-30', 'OTHERS', '050498' FROM DUAL UNION ALL 
SELECT DATE '2015-07-01', DATE '2015-11-15', 'OTHERS', '050498' FROM DUAL UNION ALL 
SELECT DATE '2015-11-16', DATE '2015-12-31', 'OTHERS', '050498' FROM DUAL UNION ALL 
SELECT DATE '2016-01-01', DATE '2016-01-30', 'OTHERS', '050498' FROM DUAL UNION ALL 
SELECT DATE '2016-04-01', DATE '2016-07-31', 'hire', '83982' FROM DUAL UNION ALL 
SELECT DATE '2015-01-01', DATE '4712-12-31', 'Others', '6447' FROM DUAL; 

クエリ

SELECT Date_From, Date_To, action, person_number 
FROM (
    SELECT t.*, 
     MAX(date_end) 
      OVER (PARTITION BY person_number 
        ORDER BY ROWNUM 
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
       ) AS mx 
    FROM table_name t 
) 
WHERE mx <> DATE '4712-12-31'; 

出力

DATE_FROM   DATE_END   ACTION PERSON_NUMBER 
------------------- ------------------- ------ ------------- 
2014-04-01 00:00:00 2014-07-31 00:00:00 HIRE 050498   
2014-08-01 00:00:00 2015-01-31 00:00:00 OTHERS 050498   
2015-02-01 00:00:00 2015-06-30 00:00:00 OTHERS 050498   
2015-07-01 00:00:00 2015-11-15 00:00:00 OTHERS 050498   
2015-11-16 00:00:00 2015-12-31 00:00:00 OTHERS 050498   
2016-01-01 00:00:00 2016-01-30 00:00:00 OTHERS 050498   
2016-04-01 00:00:00 2016-07-31 00:00:00 hire 83982   
0

これが動作するかどうか(私がしようdin't)をご確認ください。間違いがあればコメントしてください。

select * from tab_assignment_xx a where to_date('31-DEC-4712')<>(select max(date_end) from tab_assignment_xx b where a.person_number=b.person_number); 
関連する問題