[英]Query to remove the duplicates from SQL
我在桌子上叫做距離。 它有4列。 id,start_from,end_to和distance 。
我有一些重復的記錄。 在這個意義上重復記錄,
start_from | end_to | distance
Chennai Bangalore 350
Bangalore Chennai 350
Chennai Hyderabad 500
Hyderabad Chennai 510
在上表中, 欽奈到班加羅爾和班加羅爾與欽奈都有相同的距離 。 所以我需要查詢在select上刪除該記錄。
我想要一個外出的東西
start_from | end_to | distance
Chennai Bangalore 350
Chennai Hyderabad 500
Hyderabad Chennai 510
您可以使用以下查詢來查找重復項:
SELECT LEAST(start_from, end_to) AS start_from,
GREATEST(start_from, end_to) AS end_to,
distance
FROM mytable
GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
HAVING COUNT(*) > 1
輸出:
start_from, end_to, distance
--------------------------------
Bangalore, Chennai, 350
現在,您可以使用上述查詢作為派生表來過濾掉重復項:
SELECT t1.*
FROM mytable AS t1
LEFT JOIN (
SELECT LEAST(start_from, end_to) AS start_from,
GREATEST(start_from, end_to) AS end_to,
distance
FROM mytable
GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
HAVING COUNT(*) > 1
) AS t2 ON t1.start_from = t2.start_from AND
t1.end_to = t2.end_to AND
t1.distance = t2.distance
WHERE t2.start_from IS NULL
WHERE
子句謂詞t2.start_from IS NULL
,過濾掉重復的記錄。
輸出:
start_from end_to distance
--------------------------------
Chennai Bangalore 350
Chennai Hyderabad 500
Hyderabad Chennai 510
如果Chennai to Bangalore
或Bangalore to Chennai
沒有區別,您可以試試這個:
select
max(`start_from`) as `start_from`,
min(`end_to`) as `end_to`,
`distance`
from yourtable
group by
case when `start_from` > `end_to` then `end_to` else `start_from` end,
case when `start_from` > `end_to` then `start_from` else `end_to` end,
`distance`
這是rextester中的演示 。
即使Chennai to Hyderabad
也是350也有作品演示 。
如果你想讓Bangalore to Chennai
留Bangalore to Chennai
,你可以改變max
和min
:
select
min(`start_from`) as `start_from`,
max(`end_to`) as `end_to`,
`distance`
from yourtable
group by
case when `start_from` > `end_to` then `end_to` else `start_from` end,
case when `start_from` > `end_to` then `start_from` else `end_to` end,
`distance`
也是一個演示 。
並且大多數數據庫兼容的case when
。
在查詢中設置字段順序(使用值)有助於獲得唯一的行:
select distinct
case when start_from > end_to then end_to else start_from end as _start,
case when start_from > end_to then start_from else end_to end as _end,
distance
from distance;
經過測試我得到:
+-----------+-----------+----------+
| _start | _end | distance |
+-----------+-----------+----------+
| Bangalore | Chennai | 350 |
| Chennai | Hyderabad | 500 |
| Chennai | Hyderabad | 510 |
+-----------+-----------+----------+
假設你的表喜歡
id start_from end_to distance
0 Chennai Bangalore 350
1 Bangalore Chennai 350
2 Chennai Hyderabad 500
3 Hyderabad Chennai 510
然后您可以使用查詢與id進行比較。
Select
O.start_from,
O.end_to,
O.distance
From
distance O
Left Join
distance P
On
1 = 1
and O.start_from = P.end_to
and O.end_to = P.start_from
Where
1 = 1
and O.distance <> P.distance
or(O.distance = P.distance and O.id < P.id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.