具有多个记录的ID - 如何查找我需要的记录?
问题描述:
我有一个包含ID(用于完成作业的人),作业完成年份(YYYY)和Jobtype Id的表格(作业类型)。具有多个记录的ID - 如何查找我需要的记录?
|ID | YEAR | JOBTYPE|
|123A| 2017 |1
|124A| 2017 |2
|125A| 2016 | 2
|126A| 2017 |3
|123A| 2017 |2
|125A| 2016 |2
我需要的是找到所有人的,只有完成Jobtype 2在2017年在上表中的ID,这将只有124A。 (2016年完成了125人的Jobtype 2; 123A完成了1和2;等等)。旁注:如果一个ID在2017年完成了多个Jobtype 2,那么无关紧要 - 我想要这些记录。
我该怎么做?我已经尝试了一些NOT EXISTS查询,但是我认为我会陷入困境,因为1 ID可能会有一些记录反对它。我猜我需要以某种方式组合数据,所以每个ID都有一条记录,然后以这种方式进行查询?或者我错过了一些非常明显的东西?我在SQL Server 2012中工作,只是看不到前进的方向。 (如果我错过了一些非常简单的道歉,但是我通常没有理由在选择语句之外做任何事情)。
答
编写一个查询来获取所有的id那里有jobtype完井是不是2在2017年,然后只选择记录中,其中id
是不是在第一次查询的结果:
SELECT *
FROM table
WHERE jobtype = 2 and year = 2017
AND id NOT IN (SELECT id FROM table WHERE jobtype <> 2 and Year=2017)
答
你想要每个ID的信息,所以GROUP BY
ID。然后在HAVING
中过滤。例如:
select id
from jobtypes
having min(year) = 2017
and max(year) = 2017
and min(jobtype) = 2
and max(jobtype) = 2
;
该标准可以很容易地进行调整。例如,其他人将您的标准理解为:2017年有一条或多条2017 | 2条记录,并且没有其他记录,但我将其理解为一条或多条2017 | 2条记录,根本没有其他记录。如果你只想看2017年:
select id
from jobtypes
where year = 2017
having min(jobtype) = 2
and max(jobtype) = 2
;
无论适用的标准,该表必须只读一次。
答
希望这会工作,
SELECT * FROM #Your_Table A WHERE JobType=2 AND Year=2017 AND NOT EXISTS(
SELECT ID FROM (SELECT *,Row_number() Over(Partition by ID Order by ID) AS Row_Num FROM #Your_Table)B
WHERE JobType=2 and Row_num>1 and B.ID=A.ID)
答
SELECT a.*
FROM #test a
left join (Select id from #test where jobtype<>2 and [Year] = 2017) b on a.id=b.id
where jobtype=2 and year=2017 and b.id is null
啊哈!不在!非常感谢你 - 我当然试图创造一个比它需要的复杂得多的解决方案! – ProfEng