繁体   English   中英

SQL:比较同一个表中的行

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM