选择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年。