![](/img/trans.png)
[英]SQL Server - Select Rows, Remove Duplicates But Keep row with highest date
[英]How to remove unique rows and KEEP duplicates? SQL
我正在嘗試運行一個自定義sql查詢,以僅選擇數據集中的重復行,不包括唯一結果。
我試圖僅顯示每個項目的重復行,即,如果對於一個項目(汽車),用戶兩次添加了一個產品(窗口)。 盡管窗口可能包含在許多其他項目(房屋,建築物等)中,但條件是項目內的重復,而不是整個數據集。
有可能為此編寫查詢嗎?
更新:
如下圖所示,項目(id)500和505中包含重復的部分(窗口和引擎蓋),所以我想顯示的只是包含重復項的項目(id)的結果。 因此,最終視圖將沒有項目501、502、503、504、506。重復的項目將僅顯示包含重復字段的行,即項目500(id)將僅顯示行100(作用域),而項目500(id)將僅顯示行100(作用域)。 108,並刪除唯一的101、102和114。 如下所示,部分OC01(以紅色突出顯示)也可以在其他項目(id)上顯示,但是不應顯示項目503,因為OC01在該ID中沒有重復。
數據包含在一個excel文件中,然后由一個名為Tableau的BI軟件對其進行操作,該軟件可讓我編寫自定義sql以不同方式從xls提取數據。
您可以使用窗口/分析功能輕松完成此操作:
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;
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)
如果您的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
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.