我有桌子。
id dept Person
1 ece p1
2 ece p1
3 ece null
4 ece null
6 eee null
5 eee p2
6 Civil P3
7 Civil P4
8 Civil null
将空值替换为基于部门的相应人员值。在这种情况下,我们必须将“ Civil”和“ Civil”忽略为2人P3和P4。我们只需要关心具有唯一身份(即ece和eee)的部门。
1)输出应类似于
id dept Person
1 ece p1
2 ece p1
**3 ece p1
4 ece p1**
**6 eee p2**
5 eee p2
6 Civil P3
7 Civil P4
我有一个疑问,如何只提取其部门的人员多于独立人员的行。
2) id 部门 人员
4 Civil P3
5 Civil P4
Q3)
id dept Person Rating
1 ece p1 R1
2** ece p2 Null**
6 eee P6 R1
5** eee p2 Null**
6 Civil P7 Null
7 Civil P3 Null
8 Civil P8 R5
9 Mech p7 R2
10 Mech P3 Null
对于第三季度)。我只需要一行人的评分为空并且他们各自在不同团队中的评分相同的行。由于P2在不同的ece和eee团队中,他们各自的个人评分相同,即 R1
第三季度的输出
id dept Person Rating
2 ece p2 Null
5 eee p2 Null
它不应包含以下行,因为P3在Civil和Mech中都存在,但是人的等级不同即R5和R2
输出不应包括以下这些记录。 id部门人员评分 7民用P3空 10 Mech P3空
答案 0 :(得分:0)
您可以尝试将COUNT
与窗口功能一起使用,通过dept
列获取数字,获取cnt > 1
数据。
SELECT *
FROM (
SELECT *,COUNT(*) OVER (PARTITION BY dept ORDER BY dept) cnt
FROM T
)t1
where cnt > 1
答案 1 :(得分:0)
第一季度:
您可以使用子查询来查找所有具有多个不重复人员的部门,然后查找该列表中该部门位于的所有记录:
SELECT *
FROM Ihavetable
WHERE dept IN (
SELECT dept
FROM Ihavetable
GROUP BY dept
HAVING COUNT(DISTINCT Person) > 1
);
第二季度:
要返回所有记录,但对于具有唯一一个不同Person的部门而言,请使用完全相同的唯一Person替换Person列中的NULL值,您可以使用以下方式:
WITH
calculation (dept, num, pMax) AS (
SELECT dept, COUNT(DISTINCT Person), MAX(Person)
FROM Ihavetable
GROUP BY dept
)
SELECT t.id, t.dept,
CASE c.num
WHEN 1 THEN ISNULL(t.Person, c.pMax)
ELSE t.person
END AS Person
FROM Ihavetable t
LEFT JOIN calculation c ON t.dept = c.dept
如果您不想看到不可替换的NULL值,请在末尾添加以下WHERE子句:
WHERE c.num = 1 OR t.Person IS NOT NULL;
第三季度:
此查询将返回至少两个团队中具有零评分的所有人员,并且这些团队中所有具有非零评分的“各自人员”(同事)具有相同的非零评分(此人本身可以是自己的同事,并且在第三支团队中没有零分):
WITH
calculation AS (
SELECT t1.Person
FROM Ihavetable t1
INNER JOIN Ihavetable t2 ON t1.dept = t2.dept
WHERE t1.Rating IS NULL
GROUP BY t1.Person
HAVING COUNT(DISTINCT t2.Rating) = 1
AND COUNT(DISTINCT t2.dept) >= 2
)
SELECT id, dept, Person, Rating
FROM Ihavetable
WHERE Rating IS NULL
AND Person IN (SELECT Person FROM calculation);