MaxCompute(ODPS)一對多連表時實現多行過濾(同樣適用於MySQL)

需求

給定表A、B:

  1. A中存在非主鍵列XA中有多行記錄、X值相同;
  2. 1中X值可在B中找到多行記錄,但連表時A只需一條B記錄;
  3. 1中不同行、在B中選擇可能不同記錄(可能有多種條件),即多行過濾
+-----+-----+
| AID | X   |
+-----+-----+
| a1  | x1  |
+-----+-----+
| a2  | x1  |
+-----+-----+

+-----+-----+
| BID | X   |
+-----+-----+
| b1  | x1  |
+-----+-----+
| b2  | x1  |
+-----+-----+
| b3  | x2  |
+-----+-----+

期望連表查詢結果:

+-----+-----+-----+
| AID | X   | BID |
+-----+-----+-----+
| a1  | x1  | b1  |
+-----+-----+-----+
| a2  | x1  | b2  |
+-----+-----+-----+

解決思路

ODPS提供了UDF、WINDOW函數等:

  • UDF只能解決單行數據問題、不能解決一對多問題
  • 窗口函數只能解決單表問題。
  • UDJ方案還未研究。

目前使用了SQL方案:

SELECT AID,
       if(tmp.k = 0, tmp.ks[0], tmp.k) as BID
    FROM A a
        LEFT JOIN (
            select x, SUM(IF(任意擴展條件, BID, 0)) k, collect_set(BID) as ks
            from B b group by x
        ) tmp on a.x = tmp.x;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章