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;
注: