如何通过省略组中的值来减少数据集

时间:2017-02-01 16:15:35

标签: sql database oracle

我正在寻找一些有关我查询的帮助。我需要创建一个包含旧表中数据子集的新表。用于执行此操作的重要属性是groupid和类别。该类别包含具有字母和数字的字符串数据。以下是我的数据的示例:

---------------------------------------------
| groupid    | category     |  test_results |
---------------------------------------------
| 001        |  red16tall   |               |
| 001        |  blue13small |
| 002        |  green16small|
| 002        |  blue16small |
| 003        |  yellow3tall |
| 003        |              |
| 004        | orange16tall |
| 004        | blue3tall    |
| 005        | red16short   |
| 005        |              |
| 006        | blue3short   |  red16big  |
| 006        | green16flat  |            |
| 007        |              | black16fat |
| 007        | orange05big  |            |
------------------------------------------

我想要做的是省略任何两个记录中都有16个记录的组,并保留其他所有组。引用上面的例子,这就是我希望新表的样子:

-----------------------------
| groupid    | category     |
-----------------------------
| 001        |  red16tall   |
| 001        |  blue13small |
| 003        |  yellow3tall |
| 003        |              |
| 004        | orange16tall |
| 004        | blue3tall    |
| 005        | red16short   |
| 005        |              |
| 007        |              | black16fat |
| 007        | orange05big  |            |
------------------------------------------    

这是我尝试使用的查询,但这省略了其中包含16的所有内容:

create table mytable as
select *
from old_table t1
where not exists (
    select 1 from old_table  t2
    where t1.groupid = t2.groupid
    and t2.catagory like '%16%'  );

任何人都可以帮我改进这段代码,还是有人知道更好的方法吗?请记住,我想保留数据集中的所有属性,我只想删除两个记录都有16的组。谢谢。

编辑:将test_results字段添加到原始表中,以及最后4条记录作为示例。除原始查询外,如何从group_id 006中排除记录?类别和test_results字段都有%16%。我还想保留测试结果为16的记录,但类别为空。

2 个答案:

答案 0 :(得分:2)

我相信你想要这个:

create table mytable as
    select t1.*
    from old_table t1
    where exists (select 1
                  from old_table t2
                  where t1.groupid = t2.groupid and
                        t2.category not like '%16%'
                 );

也就是说,您希望该组中某些内容的所有组都没有16

编辑:

对于groupid = 5,您可以将NULL视为不是"%16%"非常容易:

编辑:

如果category可以是NULL(而不是空白),那么只需在存在中包含该逻辑:

create table mytable as
    select t1.*
    from old_table t1
    where exists (select 1
                  from old_table t2
                  where t1.groupid = t2.groupid and
                        (t2.category not like '%16%' or t2.category is null)
                 );

答案 1 :(得分:2)

我不同意接受的答案。它没有返回OP给出的期望结果:即它错误地省略了groupid'''&#39>。

我认为需要更改为以下内容:

create table mytable as
    select t1.*
    from old_table t1
    where exists (select 1
                  from old_table t2
                  where t1.groupid = t2.groupid and
                        ( t2.category not like '%16%'
                       or t2.category is null )
                 );