选择SQL中不连续出现的所有人员

选择SQL中不连续出现的所有人员,sql,oracle,Sql,Oracle,我有以下内容的人员表: year name 2015 John 2016 John 2017 John 2015 Mary 2015 Jennifer 2016 Jennifer 2015 Lisa 2016 Lisa 2017 Lisa 我怎样才能得到所有这些年来没有持续出现的人 答案应该是: 2015 Mary 2015 Jennifer 2016 Jennifer 一种方法是按名称聚合,然后断言给定名称的不同

我有以下内容的人员表:

year    name
2015    John
2016    John
2017    John
2015    Mary
2015    Jennifer
2016    Jennifer
2015    Lisa
2016    Lisa
2017    Lisa
我怎样才能得到所有这些年来没有持续出现的人

答案应该是:

2015    Mary
2015    Jennifer
2016    Jennifer

一种方法是按名称聚合,然后断言给定名称的不同年数不等于整个表中的总不同年数

SELECT t1.name
FROM yourTable t1
INNER JOIN
(
    SELECT name
    FROM yourTable
    GROUP BY name
    HAVING COUNT(DISTINCT year) < (SELECT COUNT(DISTINCT year) FROM yourTable)
) t2
     ON t1.name = t2.name
ORDER BY
    t1.name,
    t1.year;

一种方法是按名称聚合,然后断言给定名称的不同年数不等于整个表中的总不同年数

SELECT t1.name
FROM yourTable t1
INNER JOIN
(
    SELECT name
    FROM yourTable
    GROUP BY name
    HAVING COUNT(DISTINCT year) < (SELECT COUNT(DISTINCT year) FROM yourTable)
) t2
     ON t1.name = t2.name
ORDER BY
    t1.name,
    t1.year;

您可以使用下面的查询

select * from persons p1
where exists
(select name, count(1) from persons p2 where p1.name=p2.name group by name having count(1) <
(select count(distinct year) from persons));

您可以使用下面的查询

select * from persons p1
where exists
(select name, count(1) from persons p2 where p1.name=p2.name group by name having count(1) <
(select count(distinct year) from persons));

您可以使用以下查询:


您可以使用以下查询:


我建议使用窗口功能。假设每个名称没有重复项:

select p.*
from (select p.*,
             count(*) over (partition by name) as cnt_name,
             count(distinct year) over () as cnt_years
      from persons p
     ) p
where cnt_name <> cnt_years;

我建议使用窗口功能。假设每个名称没有重复项:

select p.*
from (select p.*,
             count(*) over (partition by name) as cnt_name,
             count(distinct year) over () as cnt_years
      from persons p
     ) p
where cnt_name <> cnt_years;

如果2016年没有人在场怎么办?列出每一个人或考虑今年无关?每个人都应该出现在2015至2017年如果没有人出现在2016?列出每一个人或考虑今年无关?每个人都应该出现在2015至2017年。