我有一个包含此示例数据的表格,其中
Id
和 productname
是列。我需要一个输出,当它与其他 Product1
具有相同的 Id 时返回 ProductNames
(请参阅下表的输出)。
身份证 | 产品名称 |
---|---|
ABC123 | 产品1 |
ABC123 | 产品2 |
XYZ345 | 产品1 |
PQR123 | 产品1 |
MNP789 | 产品3 |
EFG456 | 产品1 |
EFG456 | 产品6 |
EFG456 | 产品7 |
JKL909 | 产品8 |
JKL909 | 产品8 |
JKL909 | 产品8 |
DBC778 | 产品9 |
DBC778 | 产品10 |
期望的输出:
身份证 | 产品名称 |
---|---|
ABC123 | 产品1 |
ABC123 | 产品2 |
EFG456 | 产品1 |
EFG456 | 产品6 |
EFG456 | 产品7 |
基本上是和其他产品有
Product1
的时候按Id分组
我厌倦了以下查询,但没有给出预期的结果
select Id, ProductName
from tbl1
group by Id, ProductName
having count(ProductName) > 1
提前致谢
我认为,你最好在没有的情况下对桌子进行分组。查询将如下所示:
select *
from tbl1
group by Id, ProductName
希望这能解决你的问题
以下是完成任务的一种方法。
DISTINCT
不是您的样本数据所必需的,但在存在重复的情况下需要,这可能基于其他产品的样本数据。
SELECT DISTINCT Id, ProductName
FROM @Product
WHERE Id IN(
SELECT Id
FROM @Product
WHERE ProductName = 'Product1'
)
AND Id IN(
SELECT Id
FROM @Product
WHERE ProductName <> 'Product1'
)
ORDER BY Id, ProductName;
使用
COUNT(*) OVER (PARTITION BY Id)
会给你HAVING
-like functionality.
WITH cte AS (
SELECT Id,
ProductName,
NumProductsForId = COUNT(*) OVER (PARTITION BY Id),
DoesIdContainDesiredProductName = MAX(CASE WHEN ProductName = 'Product1' THEN 1 END) OVER (PARTITION BY Id)
FROM tbl1
)
SELECT Id, ProductName
FROM cte
WHERE NumProductsForId > 1
AND DoesIdContainDesiredProductName = 1;
两个典型的选项是:
select * from T
where exists (
select 1 from T t2
where t2.Id = t.Id and t2.ProductName <> t.ProductName
);
with data as (
select *, count(*) over (partition by Id) as cnt
from T
)
select * from data where cnt > 1;