按Having子句分组并检查值是否相同

时间:2019-03-07 06:27:33

标签: sql oracle hive

我有一个如下表。

Site  |   VSID1 |  VSID2 | Status
C1    |    0.1  |  1     |  Rejected
C1    |    0.1  |  1     |  Agreed
C1    |    0.2  |  2     |  Rejected
C1    |    0.2  |  2     |  Rejected

我想在查询中获得结果,并希望所有唯一且状态相同的记录,例如按(站点,VSID1,VSID2)分组并选择记录,检查是否所有行的状态均为“已拒绝”

答案应该是第二组记录。不应选择第一组记录,因为它已拒绝并同意。另一方面,应选择第二组,因为两者均被拒绝。

任何帮助,非常感谢。

我尝试使用(instr(status,'Rejected')> 1

3 个答案:

答案 0 :(得分:1)

您可以在下面尝试-

select Site ,VSID1 , VSID2 , Status
group by Site ,VSID1 , VSID2 , Status
having sum(case when status='Rejected' then 0 else 1 end)=0

OR Correlatd子查询

select * from tablename a where not exists (select 1 from tablename b where a.Site
=b.site and a.VSID1=b.VSID1  and a.VSID2=b.VSID2 where status<>'Rejected')

答案 1 :(得分:1)

最大和最小:

select Site, VSID1, VSID2, min(Status) Status
from tablename 
group by Site ,VSID1 , VSID2
having min(Status)='Rejected' and max(Status)='Rejected'

如果要从表中获取所有行:

select t.* from tablename t inner join (
    select Site, VSID1, VSID2
    from tablename 
    group by Site ,VSID1 , VSID2
    having min(Status)='Rejected' and max(Status)='Rejected'
) tt
inner join tt.Site = t.Site and tt.VSID1 = t.VSID1  and tt.VSID2 = t.VSID2

答案 2 :(得分:0)

SELECT site, VSID1, VSID2, max(Status)
FROM tbl
GROUP BY site, VSID1, VSID2
HAVING COUNT(DISTINCT Status) = 1

max(Status)可能看起来不太好,但是如果需要在输出中添加Status,它将为您解决问题。