[英]Oracle SQL using Distinct and Group By
我在下面有一张桌子
+-----+------+-----------+------------+
| id | type | last_name | first_name |
+-----+------+-----------+------------+
| 1 | A | Billy | John |
| 2 | B | Bob | Joe |
| 3 | A | Joe | Zeb |
| 4 | C | Billy | John |
| ... | ... | ... | ... |
+-----+------+-----------+------------+
我想返回所有具有相同LAST_NAME
和FIRST_NAME
,但具有不同TYPE
。
我需要做一个子查询来首先获得相同的名称,然后根据TYPE
对其进行过滤吗?
我想返回的是:
+-----+------+-----------+------------+
| id | type | last_name | first_name |
+-----+------+-----------+------------+
| 1 | A | Billy | John |
| 4 | C | Billy | John |
| ... | ... | ... | ... |
+-----+------+-----------+------------+
这是使用相关子查询的一种可能方法:
select t.*
from table1 t
where exists
(
select 1 from table1 u
where
u.last_name = t.last_name and
u.first_name = t.first_name and
u.type <> t.type
)
或者,也许使用连接:
select t.*
from table1 t inner join
(
select u.last_name, u.first_name
from table1 u
group by u.last_name, u.first_name
having min(u.type) <> max(u.type)
) q
on t.last_name = q.last_name and t.first_name = q.first_name
更改table1
以适合您的表名。
也许我监督了一些事情。 你有什么想法:
select * from table
group by last_name, first_name
having count(type) = 1
使用窗口函数应该很简单,从早期版本开始就可以在 Oracle 中使用这些函数:
SELECT x.id, x.type, x.last_name, x.first_name
FROM (
SELECT t.*, COUNT(DISTINCT type) OVER (PARTITION BY last_name, first_name) cnt
FROM mytable t
) x WHERE x.cnt > 1
内部查询为每个记录分配当前名字/姓氏元组的不同类型的计数,外部查询筛选出计数为 1 的行。
ID | TYPE | LAST_NAME | FIRST_NAME -: | :--- | :-------- | :--------- 1 | A | Billy | John 4 | C | Billy | John
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.