簡體   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