[英]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.