2015-08-09 87 views
3

我有类似下表的数据。oracle查询根据条件删除重复行

+------+----------+----------+ 
| type | date1 | date2 | 
+------+----------+----------+ 
| IT1 | 05/01/15 | 08/01/15 | 
| IT1 | 05/01/15 |   | 
| IT1 | 04/01/15 |   | 
| IT1 |   | 03/02/15 | 
| IT1 | 06/01/15 | 03/02/15 | 
| IT1 |   | 04/02/15 | 
| IT2 | 05/01/15 |   | 
| IT2 | 05/01/15 | 04/01/15 | 
| IT2 | 03/01/15 |   | 
| IT2 |   | 09/01/15 | 
+------+----------+----------+ 

我需要通过除去重复项以获得行,结果是下面

+------+----------+----------+ 
| type | date1 | date2 | 
+------+----------+----------+ 
| IT1 | 05/01/15 | 08/01/15 | 
| IT1 | 04/01/15 |   | 
| IT1 | 06/01/15 | 03/02/15 | 
| IT1 |   | 04/02/15 | 
| IT2 | 05/01/15 | 04/01/15 | 
| IT2 | 03/01/15 |   | 
| IT2 |   | 09/01/15 | 
+------+----------+----------+  

用于particaular类型,

  1. 如果相应的日期2存在对DATE1,然后选择该行并删除其他日期1
  2. 如果相应的日期2不存在,则保留它

同样,

  • 如果相应DATE1存在对DATE2,然后选择该行,并删除其它DATE2
  • 如果相应的日期1不存在,那么保持它
  • 是否有可能为此编写oracle查询? 任何人都可以帮助我做到这一点?

    回答

    1

    尝试此查询:

    select * 
    from table1 t1 
    WHERE 
        "date2" IS NOT NULL 
        AND 
        "date1" IS NOT NULL 
        OR 
        "date2" IS NULL 
        AND NOT EXISTS (
        SELECT 1 FROM table1 t2 
        WHERE t1."type" = t2."type" 
         AND t1."date1" = t2."date1" 
         AND t2."date2" IS NOT NULL 
        ) 
        OR 
        "date1" IS NULL 
        AND NOT EXISTS(
        SELECT 1 FROM table1 t2 
        WHERE t1."type" = t2."type" 
         AND t1."date2" = t2."date2" 
         AND t2."date1" IS NOT NULL 
        ) 
    

    演示:http://sqlfiddle.com/#!4/12b8b/8