我正在尝试运行自定义SQL查询以仅选择数据集中的重复行,但不包括唯一结果。
我试图仅显示每个项目的重复行,即如果项目(汽车)用户添加了两次产品(窗口)。虽然窗口可能包含在许多其他项目(房屋,建筑物等......)中,但条件是项目内的重复,而不是整个数据集。
是否可以为此编写查询?
更新:
正如您在下图所示,项目(id)500和505中包含重复的部分(窗口和引擎盖),因此我想要显示的只是包含重复项目的项目(ID)的结果。因此,最终视图将不具有项目501,502,503,504,506。并且重复的那些将仅显示包含重复字段的行,即项目500(id)将仅显示行100(范围)和108,并删除101,102和114,它们是唯一的。 如下所示,部分OC01(以红色突出显示)也可以显示在其他项目(id)上,但不应显示项目503,因为OC01在该ID内没有重复。
数据包含在excel文件中,然后由名为Tableau的BI软件操作,该软件允许我编写自定义sql以不同方式从xls中提取数据。
答案 0 :(得分:3)
您可以使用窗口/分析功能轻松完成此操作:
select t.*
from (select t.*, count(*) over (partition by project, product) as cnt
from table t
) t
where cnt > 1;
大多数数据库都支持这些功能。如果它们不可用,您可以使用相关子查询或加入group by
查询来执行逻辑。
编辑:
我不知道Tableau是否支持上述查询。你可以试试这个:
select t.*
from table t1
where 1 < (select count(*)
from table t2
where t2.project = t.project and t2.product = t.product
);
也许这个版本可行:
select t.*
from table t join
(select project, product, count(*) as cnt
from table t
group by project, product
) pp
on t.project = pp.project and t.product = pp.product and cnt > 1;
答案 1 :(得分:1)
SELECT * FROM TABLE1
WHERE project
IN (SELECT X.project FROM (
SELECT project, product,COUNT(product)
FROM TABLE1
GROUP BY project,product
HAVING COUNT(product) > 1)X)
AND product IN (SELECT X.product FROM (
SELECT project, product,COUNT(product)
FROM TABLE1
GROUP BY project,product
HAVING COUNT(product) > 1)X)
答案 2 :(得分:1)
如果您的DBMS不支持Gordon Linoff解决方案使用的窗口聚合函数,您可以这样做:
select t1.*
from table t1
join
(select project, product
from table
group by project, product
having count(*) > 1
) t2
on t1.project = t2.project
and t1.product = t2.Product;
根据更新的查询进行编辑:
SELECT *
FROM tab t1
WHERE EXISTS
(
SELECT * FROM tab t2
WHERE t1.id = t2.id
AND t1.part = t2.part
AND t1.scope <> t2.scope
);