SQL 服务器 - 不同
SQL Server - Distinct
这是我的 table:
我想知道哪些名称与来源“comp”和来源“manual”存在不止一次。
所以在这种情况下,我希望输出为:host3 zyx(名称和组)
因为host3这个名字存在不止一次,而且它有源码手册和源码包。
我试过这个(SQL 服务器):
SELECT name, group
FROM table
GROUP BY name
HAVING (COUNT(name) > 1) and ????
据我了解,您想要的是
SELECT name, max([group]) -- or STRING_AGG([group],',')
FROM table
WHERE source in ('comp','manual')
GROUP BY name
HAVING COUNT(DISTINCT source) > 1
或者您也必须按(在大多数 sql 方言中)分组
SELECT name, [group]
FROM table
WHERE source in ('comp','manual')
GROUP BY name, [group]
HAVING COUNT(DISTINCT source) > 1
我理解正确,你可以尝试在HAVING
COUNT
中使用条件聚合函数和条件
如果 source
创建正确的索引,我们可以使用 WHERE
的条件来提高我们的性能。
SELECT name,[group]
FROM [table]
WHERE source in ('comp','manual')
GROUP BY name,[group]
HAVING COUNT(DISTINCT CASE WHEN source = 'manual' THEN source END) = 1
AND COUNT(DISTINCT CASE WHEN source = 'comp' THEN source END) = 1
另一种思考方式是计算 CTE 内的计数,然后过滤:
; -- see sqlblog.org/cte
WITH cte AS
(
SELECT name,
[group],
SourceCount = COUNT(DISTINCT source)
FROM dbo.tablename
WHERE source IN ('comp', 'manual')
GROUP BY name, [group]
)
SELECT name, [group]
FROM cte
WHERE SourceCount = 2;
如果你认为 CTE 很恶心,或者不喜欢我写的防御性的,你也可以使用子查询:
SELECT name, [group] FROM
(
SELECT name, [group],
SourceCount = COUNT(DISTINCT source)
FROM dbo.tablename
WHERE source IN ('comp', 'manual')
GROUP BY name, [group]
) AS q WHERE SourceCount = 2;
再一次,重点是提供另一种思考方式,尤其是对于新学习者,不要使用尽可能少的字符,或者安抚那些只能以一种方式思考问题的人他们的方法是解决问题或教导他人的唯一“好”或“正确”方法。
这两个和接受的答案都具有相同的性能,低至子树成本的小数点后七位。仅仅因为您不喜欢我的福特金牛座的外观,并不意味着这对我来说是去市区的糟糕方式(或者是一种不可接受的载人方式)。 I blogged about this here.
这是我的 table:
我想知道哪些名称与来源“comp”和来源“manual”存在不止一次。
所以在这种情况下,我希望输出为:host3 zyx(名称和组) 因为host3这个名字存在不止一次,而且它有源码手册和源码包。
我试过这个(SQL 服务器):
SELECT name, group
FROM table
GROUP BY name
HAVING (COUNT(name) > 1) and ????
据我了解,您想要的是
SELECT name, max([group]) -- or STRING_AGG([group],',')
FROM table
WHERE source in ('comp','manual')
GROUP BY name
HAVING COUNT(DISTINCT source) > 1
或者您也必须按(在大多数 sql 方言中)分组
SELECT name, [group]
FROM table
WHERE source in ('comp','manual')
GROUP BY name, [group]
HAVING COUNT(DISTINCT source) > 1
我理解正确,你可以尝试在HAVING
COUNT
中使用条件聚合函数和条件
如果 source
创建正确的索引,我们可以使用 WHERE
的条件来提高我们的性能。
SELECT name,[group]
FROM [table]
WHERE source in ('comp','manual')
GROUP BY name,[group]
HAVING COUNT(DISTINCT CASE WHEN source = 'manual' THEN source END) = 1
AND COUNT(DISTINCT CASE WHEN source = 'comp' THEN source END) = 1
另一种思考方式是计算 CTE 内的计数,然后过滤:
; -- see sqlblog.org/cte
WITH cte AS
(
SELECT name,
[group],
SourceCount = COUNT(DISTINCT source)
FROM dbo.tablename
WHERE source IN ('comp', 'manual')
GROUP BY name, [group]
)
SELECT name, [group]
FROM cte
WHERE SourceCount = 2;
如果你认为 CTE 很恶心,或者不喜欢我写的防御性的,你也可以使用子查询:
SELECT name, [group] FROM
(
SELECT name, [group],
SourceCount = COUNT(DISTINCT source)
FROM dbo.tablename
WHERE source IN ('comp', 'manual')
GROUP BY name, [group]
) AS q WHERE SourceCount = 2;
再一次,重点是提供另一种思考方式,尤其是对于新学习者,不要使用尽可能少的字符,或者安抚那些只能以一种方式思考问题的人他们的方法是解决问题或教导他人的唯一“好”或“正确”方法。
这两个和接受的答案都具有相同的性能,低至子树成本的小数点后七位。仅仅因为您不喜欢我的福特金牛座的外观,并不意味着这对我来说是去市区的糟糕方式(或者是一种不可接受的载人方式)。 I blogged about this here.