![](/img/trans.png)
[英]SQL Where condition in group by with 2 contradicting clauses
[英]SQL Where condition with 2 contradicting clauses Oracle
我有一个包含元素列表的表格,这些元素具有由一个关系确定的“创建者类型”。 此关系字段值可以是 1-2-3。
我必须使用以下条件进行 sql 查询:
时间表
ID|NAMEUNIQUE|STARTTIME|ENDTIME|STATUS|CREATOR|CREATOR_TYPE
1 |AAAAAAAAAA|.........|.......|......|.......|1
2 |BBBBBBBBBB|.........|.......|......|.......|2
3 |BBBBBBBBBB|.........|.......|......|.......|1
4 |CCCCCCCCCC|.........|.......|......|.......|3
5 |DDDDDDDDDD|.........|.......|......|.......|1
在这种情况下,查询应该返回 ID 为 2、3、4、5 的行并丢弃 1,因为这是一个唯一的时间表 (AAAAAAAAA),它没有创建者类型 2 或 3。
对不起我的英语,很难向我解释这个
您可以在分析函数中使用条件聚合:
SELECT *
FROM (
SELECT s.*,
COUNT(CASE creator_type WHEN 1 THEN 1 END)
OVER (PARTITION BY nameunique) AS num_1s,
COUNT(CASE creator_type WHEN 2 THEN 1 END)
OVER (PARTITION BY nameunique) AS num_2s,
COUNT(CASE creator_type WHEN 3 THEN 1 END)
OVER (PARTITION BY nameunique) AS num_3s
FROM schedules s
)
WHERE num_1s > 0
AND (num_2s > 0 OR num_3s > 0);
其中,对于样本数据:
CREATE TABLE schedules (id, nameunique, creator_type) AS
SELECT 1, 'AAAAA', 1 FROM DUAL UNION ALL
SELECT 2, 'BBBBB', 2 FROM DUAL UNION ALL
SELECT 3, 'BBBBB', 1 FROM DUAL UNION ALL
SELECT 4, 'CCCCC', 1 FROM DUAL UNION ALL
SELECT 5, 'CCCCC', 3 FROM DUAL UNION ALL
SELECT 6, 'DDDDD', 1 FROM DUAL;
输出:
ID NAMEUNIQUE CREATOR_TYPE NUM_1S NUM_2S NUM_3S 2 BBBB 2 1 1 0 3 BBBB 1 1 1 0 4 中国交建 1 1 0 1 5 中国交建 3 1 0 1
db<> 在这里摆弄
select *
from (
select s.*,
min(creator_type) over (partition by nameunique) as min_type,
max(creator_type) over (partition by nameunique) as max_type
from schedules s
)
where min_type = 1 and max_type > 1
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.