SQL:比较同一个表中的行

时间:2011-09-17 23:25:59

标签: sql

我正在尝试比较单个表中的行 并弄清楚同一个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。

任何提示都将不胜感激!谢谢!!

3 个答案:

答案 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

干杯,