我正在尝试比较单个表中的行 并弄清楚同一个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 包含无效的地址和有效的zip。
任何提示都将不胜感激!谢谢!!
答案 0 :(得分:2)
查询...
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
我可以建议,如果您实际上并不想在数据库中使用这种“不匹配”的数据,请重新设计您的数据模型,以便首先不会发生重复。没有重复,没有不匹配!
答案 1 :(得分: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
答案 2 :(得分:1)
按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
干杯,