[英]SQL: Compare rows in a same table
我正在嘗試比較單個表中的行,並確定相同ID下的“addr”和“zip”是相同還是不同。
id | addr | zip
------+----------+----------
1 | 123 | 0000
1 | 123 | 0000
1 | 123 | 0001
2 | 222 | 1000
2 | 221 | 1000
所以結果應該說id 1有有效的addr,無效的zip id 2有無效的addr和有效的zip。
任何提示將不勝感激! 謝謝!!
查詢......
SELECT id, COUNT(DISTINCT addr), COUNT(DISTINCT zip)
FROM YOUR_TABLE
GROUP BY id
...應該在示例數據上給出以下結果......
1,1,2
2,2,1
粗體數字大於1表示“無效”項目。
如果您想對此進行實際過濾,可以使用HAVING子句,例如:
SELECT id, COUNT(DISTINCT addr) ADDR_COUNT, COUNT(DISTINCT zip) ZIP_COUNT
FROM YOUR_TABLE
GROUP BY id
HAVING ADDR_COUNT > 1 OR ZIP_COUNT > 1
我可以建議,如果您實際上並不想在數據庫中使用這種“不匹配”的數據,請重新設計您的數據模型,以便首先不會發生重復。 沒有重復,沒有不匹配!
SELECT id
, CASE s.addrcount
WHEN 1 THEN 'valid'
ELSE 'invalid' END as addrok
, CASE s.zipcount
WHEN 1 THEN 'valid'
ELSE 'invalid' END as zipok
FROM
(
SELECT id
, count(distinct addr) as addrcount
, count(distinct zip) as zipcount
FROM table1
GROUP BY id
) as s
按ID分組。 選擇id, COUNT(DISTINCT addr)
和COUNT(DISTINCT zip)
列。 過濾不同地址或緯度數> 1
。
這將為您提供重復數據不一致的ID。
例:
SELECT id, COUNT(DISTINCT addr) nAddr, COUNT(DISTINCT zip) nZip
FROM [mytable]
GROUP BY id
HAVING nAddr > 1 OR nZip > 1
干杯,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.