繁体   English   中英

使用 Distinct 和 Group By 的 Oracle SQL

[英]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_NAMEFIRST_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 的行。

DB Fiddle 上的演示

ID | TYPE | LAST_NAME | FIRST_NAME
-: | :--- | :-------- | :---------
 1 | A    | Billy     | John      
 4 | C    | Billy     | John

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM