2017-07-21 7 views
1

私は2つのテーブルを持っています。 1つはReferenceテーブルで、優先度のソートに使用され、1つはCustomerテーブルです。 Referenceテーブルは、Customerテーブルの各カラムに優先順位を付けるために使用され、単一の顧客の個々のカラムの順序が異なります。'PARTITION BY'のフィルター条件を使用

参照表

--------------------------------------- 
| Priority | Attribute | sourceID | 
--------------------------------------- 
| 1  |  EMAIL |  1  | 
| 2  |  EMAIL |  2  | 
| 3  |  EMAIL |  3  | 
| 2  |  NAME |  1  | 
| 1  |  NAME |  2  | 
| 3  |  NAME |  3  | 
--------------------------------------- 

Customerテーブル

----------------------------------------------------------------------- 
| CustomerID | Name |  Email  | SourceID |  Date | 
----------------------------------------------------------------------- 
| 1  | John |  NULL   |  1  | 03/01/2017 | 
| 1  | NULL | [email protected] |  3  | 01/01/2017 | 
| 1  | J  | [email protected] |  2  | 02/01/2017 | 
----------------------------------------------------------------------- 

結果:tでの

--------------------------------------------- 
| CustomerID | Name |  Email  | 
--------------------------------------------- 
|  1  | John | [email protected] | 
--------------------------------------------- 

私は次のクエリを使用してこれを行う瞬間です:

SELECT DISTINCT 
     FIRST_VALUE(c.Name IGNORE NULLS) 
      OVER (PARTITION BY p.customerID 
       ORDER BY r.PRIORITY, c.DATE 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS EMAIL, 
     FIRST_VALUE(c.Email IGNORE NULLS) 
      OVER (PARTITION BY c.customerID 
       ORDER BY r.PRIORITY, c.DATE 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS EMAIL 
FROM Customer c 
    JOIN reference r ON c.sourceID = r.sourceID; 

ただし、これは各列のさまざまな属性を考慮しています。私は、パーティションごとにいくつかの種類のフィルタを各パーティションに追加する必要があります。

どのように私はこれを行うに行くことができます誰も助けることができますか?これはSELECT DISTINCT代わりのGROUP BY使用していることを

SELECT DISTINCT customerId 
     first_value(CASE WHEN ca.attribute = 'NAME' THEN ca.val end) OVER 
      (PARTITION BY ca.customerId, attribute ORDER BY r.priority, ca.date) AS name, 
     first_value(CASE WHEN ca.attribute = 'EMAIL' THEN ca.val END) OVER 
      (PARTITION BY ca.customerId, attribute ORDER BY r.priority, ca.date) AS email 
FROM ((SELECT customerId, 'NAME' AS attribute, name AS val, sourceId, date 
     FROM customer c 
    ) UNION ALL 
     (SELECT customerId, 'EMAIL' AS attribute, email AS val, sourceId, date 
     FROM customer c 
    ) 
    ) ca JOIN 
    reference r 
    ON r.sourceId = ca.sourceId AND r.attribute = ca.attribute; 

注:

答えて

2

一つの方法は、列に顧客の属性を配置し、それらを再結合することです。私はNetezzaがfirst_value()集約関数を持っているとは思わないので、この構成はその問題を回避します。

関連する問題