提到這個問題:
在 SQL 表的多個列中查找重復值并計數
我有以下表結構:
id name1 name2 name3 ...
1 Hans Peter Frank
2 Hans Frank Peter
3 Hans Peter Frank
4 Paul Peter Hans
.
.
.
我使用以下命令來顯示重復項和計數:
SELECT COUNT(name1), name1, name2, name3
FROM table
GROUP BY name1, name2, name3
HAVING (COUNT(name1) > 1) AND (COUNT(name2) > 1) AND (COUNT(name3) > 1)
這個命令給了我 2 的計數。我想知道如何將第二行也算作重復。
不幸的是,原始問題的解決方案(在 SQL 表和計數中的多個列中查找重復值)對 char 不起作用
uj5u.com熱心網友回復:
首先UNION ALL在 CTE 中對表進行規范化,以在單獨的行中獲取 3 個名稱中的每一個。
然后使用ROW_NUMBER()視窗函式,您可以按字母順序排列 3 個名稱,以便您可以按它們分組:
WITH cte(id, name) AS (
SELECT id, name1 FROM tablename
UNION ALL
SELECT id, name2 FROM tablename
UNION ALL
SELECT id, name3 FROM tablename
)
SELECT COUNT(*) count, name1, name2, name3
FROM (
SELECT id,
MAX(CASE WHEN rn = 1 THEN name END) name1,
MAX(CASE WHEN rn = 2 THEN name END) name2,
MAX(CASE WHEN rn = 3 THEN name END) name3
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) rn
FROM cte
)
GROUP BY id
)
GROUP BY name1, name2, name3
HAVING COUNT(*) > 1;
另一種方法是使用與您之前的問題類似的邏輯與數值,使用字串函式REPLACE()而不是視窗函式,但僅當每行中的 3 個名稱不同時才有效:
SELECT COUNT(*) count,
MIN(name1, name2, name3) name_1,
REPLACE(
REPLACE(
REPLACE(name1 || ',' || name2 || ',' || name3, MIN(name1, name2, name3), ''),
MAX(name1, name2, name3), ''), ',', ''
) name_2,
MAX(name1, name2, name3) name_3
FROM tablename
GROUP BY name_1, name_2, name_3
HAVING COUNT(*) > 1;
請參閱演示。
uj5u.com熱心網友回復:
不是特別漂亮,而是一種不同的方法來旋轉列,然后將它們聚合為一個字串并計算重復項。不幸的是,在 SQL Lite 中,group_concat函式無法指定組內的任何排序,從而強制執行另一個級別的嵌套和 row_number,這有點麻煩。我想這是成為 SQL lite的一部分!
如果您想顯示所有重復的變體,您可以洗掉Seq和過濾條件。
with cte as (
select Duplicates, name1, name2, name3,
Row_Number() over(partition by Duplicates order by name1,name2,name3) Seq
from (
select count(*) over(partition by allnames) Duplicates, name1, name2, name3
from t
left join (
select Id, group_concat(Dname) allNames
from (
select Id, Dname, row_number() over (partition by Id order by Dname) seq
from (
select id, name1 Dname from t union all
select id, name2 from t union all
select id, name3 from t
)x
)x
group by Id
order by seq
)d on d.id=t.id
)d
)
select Duplicates, name1, name2, name3
from cte
where duplicates>1 and seq=1
演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401096.html
