[英]SQL Select Rows where a value of a multiple value field occurs only once
我有以下问题:
我有一个表,其中包含描述对象的不同列。 我们假设其中一列可以包含值1,2,3,4,5,6,7,8,9,10。 在这个表中,对象可以包含所有这些值,或者一些只包含例如值1,3,5(所以0到n的值)
现在我想找到只包含值1和2的所有对象,但如果它们包含1,2,3或其他组合(1,2),我不希望它们在我的结果集中。
我该如何编写这个SQL语句?
样本数据(预期结果集 - > Mark和Michael):
+---------+--------------------+---------------------------+--+
| OBJ | OBJ_CHARACTERISTIC | CHARACTERISTIC_DATE_ADDED | |
+---------+--------------------+---------------------------+--+
| Mark | 1 | 15.01.2018 | |
| Mark | 2 | 15.02.2018 | |
| Jimmy | 1 | 31.01.2018 | |
| Jimmy | 2 | 11.02.2018 | |
| Jimmy | 4 | 15.03.2018 | |
| Jimmy | 5 | 15.04.2018 | |
| Jimmy | 6 | 15.04.2018 | |
| Harry | 1 | 08.01.2018 | |
| Harry | 2 | 11.01.2018 | |
| Harry | 3 | 15.02.2018 | |
| Michael | 1 | 15.06.2018 | |
| Michael | 2 | 15.07.2018 | |
| Dwayne | 4 | 15.01.2018 | |
| Dwayne | 5 | 15.01.2018 | |
| Dwayne | 6 | 15.01.2018 | |
+---------+--------------------+---------------------------+--+
您可以使用分析计数来查看每个对象有多少特征,以及您要查找的特征数量; 然后比较这些计数:
select obj, obj_characteristic, characteristic_date_added
from (
select obj, obj_characteristic, characteristic_date_added,
count(distinct obj_characteristic) over (partition by obj) as c1,
count(distinct case when obj_characteristic in (1,2) then obj_characteristic end)
over (partition by obj) as c2
from your_table
)
where c1 = c2;
使用您的示例数据,可以:
OBJ OBJ_CHARACTERISTIC CHARACTERI
------- ------------------ ----------
Mark 1 2018-01-15
Mark 2 2018-02-15
Michael 1 2018-06-15
Michael 2 2018-07-15
从问题的方式来看,听起来你想要完整的行,如上所述; 你可能只想要这些名字。 如果是这样,您只需将外部选择更改为:
select distinct obj
from ...
OBJ
-------
Mark
Michael
或者通过having
子句使用聚合:
select obj
from your_table
group by obj
having count(distinct obj_characteristic)
= count(distinct case when obj_characteristic in (1,2) then obj_characteristic end);
OBJ
-------
Mark
Michael
在这种情况下,由于1和2是连续的,您也可以使用min / max作为聚合来获取名称:
select obj
from your_table
group by obj
having min (obj_characteristic) = 1
and max(obj_characteristic) = 2;
或分析地获得完整的行:
select obj, obj_characteristic, characteristic_date_added
from (
select obj, obj_characteristic, characteristic_date_added,
min(obj_characteristic) over (partition by obj) as min_char,
max(obj_characteristic) over (partition by obj) as max_char
from your_table
)
where min_char = 1
and max_char = 2;
但早期版本更通用。
如果你只是寻找sql返回行值'1,2'而没有其他用途:
select * from table where column like '%1,2'
发布数据示例,可能更有帮助理解。
@ dwin90您可以尝试:
SELECT obj
FROM your_table
WHERE (OBJ_CHARACTERISTIC=1 OR OBJ_HARACTERISTIC=2 AND OBJ_CHARACTERISTIC !> 2
)GROUP BY OBJ
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.