group by having子句并检查值是否相同

pes8fvy9  于 2021-06-27  发布在  Hive
关注(0)|答案(3)|浏览(297)

我有一张像下面这样的table。

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

我希望在查询中获得结果,并希望所有唯一且具有相同状态的记录(例如group by(site,vsid1,vsid2))并选择该记录,检查是否所有行的状态都为“rejected”
答案应该是第二组记录。不应选择第一组记录,因为它已拒绝并同意。另一方面,应选择第二组,因为这两组都被拒绝。
任何帮助,非常感谢。
我尝试了(instr(status,'rejected')>1

jgwigjjp

jgwigjjp1#

你可以在下面试试-

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

或相关子查询

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')
dwbf0jvd

dwbf0jvd2#

最大值和最小值:

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
1zmg4dgp

1zmg4dgp3#

SELECT site, VSID1, VSID2, max(Status)
FROM tbl
GROUP BY site, VSID1, VSID2
HAVING COUNT(DISTINCT Status) = 1
``` `max(Status)` 可能看起来不太好,但如果你需要的话,它对你有帮助 `Status` 在输出中。

相关问题