0

次のようなテーブルが1つあります

お客様:

| CUSTOMER_ID | CUSTOMER_NAME | BANK_ID |
-----------------------------------------
|           1 |             a |       b |
|           2 |            b1 |       c |
|           3 |            b1 |       d |
|           4 |             C |       e |
|           5 |             a |       f |
|           6 |            b1 |       g |

一意ではないすべての顧客名を検索し、それらをグループ化するクエリがあります。また、各グループの行に行番号を割り当てます。このクエリの出力は次のとおりです。

RowNumber|customer_id | customer_name |     
1        |       1    |       a       |             
2        |       5    |        a      |             
1        |       2    |        b1     |              
2        |       3    |       b1      |             
3        |       6    |        b1     |

すべてのグループで繰り返したい。グループごとに、グループのメンバーを別のテーブルの行に結合したい.各サブグループを操作し、各サブグループのアイテムにビジネスロジックを適用する方法はありますか?

例: 各グループについて、このグループのすべての顧客が同じ場所に住み、同じ場所で働いている場合、最初の顧客を残したいとします。

次の表があります。

|お客様ID | 住所 | 職場名 |

|1 | 通り1 | 仕事1|

|2 | 通り2 | 仕事1|

|3 | 通り1 | 仕事2|

|4 | ストリート5 | 仕事7|

|5 | 通り1 | 仕事1|

|6 | 通り2 | 仕事1|

最初のグループの顧客だけが同じ場所に住み、同じ場所で働いていることがわかります (顧客 ID: 1,5)。2 番目のグループ (顧客 ID: 2、3、6) を見ると、全員が同じ場所に住んで働いているわけではありません。このクエリの結果は次のようになります: 顧客 ID 5 と同じグループにあり、顧客 ID 5 と同じ場所に住み、同じ場所で働いているためです。しかし、顧客 5 はこのグループの 2 番目です。

それを行う最も簡単な方法は何ですか?

4

2 に答える 2

0

これを試して:

WITH A(Customer_id, Customer_name) 
     AS(SELECT Customer_id, Customer_name
        FROM Customer
        WHERE Customer_name IN 
                    (SELECT Customer_name FROM Customer
                     GROUP BY Customer_name
                     HAVING COUNT(Customer_name) >1)
       )
SELECT RANK() OVER (ORDER BY Customer_id ASC) AS RowNumber
      , Customer_id, Customer_Name
FROM A
ORDER BY Customer_name, Customer_id;

または、そのために JOIN を使用することもできます

WITH A(Customer_id, Customer_name) 
     AS (SELECT c.Customer_id, c.Customer_name
         FROM Customer c
         JOIN 
             (SELECT Customer_id FROM Customer
              WHERE Customer_name IN ( SELECT Customer_name FROM Customer
                                       GROUP BY Customer_name 
                                       HAVING COUNT(Customer_name) >1)
             ) AS c1
         ON c.Customer_id = C1.customer_id)
SELECT RANK() OVER (ORDER BY A.customer_id ASC) AS RowNumber
      , Customer_id, Customer_Name
FROM A
ORDER BY Customer_name, Customer_id;

このSQLFiddleを参照してください

于 2013-04-26T04:25:14.007 に答える