0

我有一张桌子看起来像

顾客:

| 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     |

我想迭代所有的组。对于每个组,我想将组的成员与不同表中的行加入。有没有办法对每个子组进行操作并对每个子组中的项目应用业务逻辑?

例如:假设对于每个组,如果该组中的所有客户都住在同一个地方并在同一个地方工作,我想离开第一个客户。

我有下表:

|客户编号 | 地址 | 工作场所名称 |

|1 | 街道1 | 工作1|

|2 | 街道2 | 工作1|

|3 | 街道1 | 工作2|

|4 | 街道5 | 工作7|

|5 | 街道1 | 工作1|

|6 | 街道2 | 工作1|

您会注意到,只有第一组中的客户在同一个地方生活和工作(客户 ID:1,5)。如果您查看第二组(客户 ID:2、3、6)- 他们并非都在同一个地方生活和工作。此查询的结果将是:客户 ID 5,因为它与客户 ID 5 在同一个组中,并且他们都在同一个地方生活和工作。但客户 5 是该组中的第二个。

最简单的方法是什么?

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 回答
0

我无法在单个查询中找到任何方法。我创建了一个游标来执行我想做的事情:迭代一个表的所有行,应用业务逻辑并将相关行插入输出表。

于 2013-05-01T23:16:53.080 回答