首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 合併 IP 列:GROUP BY + MAX 替代多表連接

     編輯:程式設計綜合問答

原始數據

ip      ip1     ip2
1.1.1.1 10.0.0.1 NULL
1.1.1.1 NULL     10.0.0.2
2.2.2.2 10.0.0.3 10.0.0.4

目標結果

ip      ip1       ip2
1.1.1.1 10.0.0.1  10.0.0.2
2.2.2.2 10.0.0.3  10.0.0.4

優化寫法

SELECT ip, MAX(ip1) AS ip1, MAX(ip2) AS ip2
FROM t1
GROUP BY ip;

原理

  • MAX 忽略 NULL,非空值中取最大(IP 字符串按字典序比較,恰好符合合併語義)。
  • 單表掃描,無需自連接,性能提升數量級(十萬行毫秒級)。

擴展:多列合併

SELECT 
    ip,
    MAX(ip1) AS ip1,
    MAX(ip2) AS ip2,
    MAX(ip3) AS ip3,
    MAX(ip4) AS ip4
FROM t1
GROUP BY ip;

適用場景

  • 同一主鍵下多行互補數據合併(ETL 清洗常見)。
  • 列之間無衝突(同一 ip 下 ip1 僅有一個非空值)。

衝突處理

若同一 ip 存在多個非空 ip1,需明確業務規則:

-- 取最新(假設有 time 列)
SELECT ip, 
       MAX(CASE WHEN rn=1 THEN ip1 END) AS ip1,
       MAX(CASE WHEN rn=1 THEN ip2 END) AS ip2
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ip ORDER BY time DESC) rn
    FROM t1
) t
WHERE rn = 1
GROUP BY ip;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved