如何在SQLServer2008中迭代子组?

如何在SQLServer2008中迭代子组?,sql,sql-server-2008,Sql,Sql Server 2008,我有一张桌子看起来像 客户: | CUSTOMER_ID | CUSTOMER_NAME | BANK_ID | ----------------------------------------- | 1 | a | b | | 2 | b1 | c | | 3 | b1 | d | | 4 |

我有一张桌子看起来像

客户:

| 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)。如果你看第二组(客户id:2,3,6)-他们并不都在同一个地方生活和工作。 此查询的结果将是:customer id 5,因为它与customer id 5位于同一个组中,并且他们都在同一个地方生活和工作。但客户5是这一组中的第二位

最简单的方法是什么

试试这个:

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;

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

我感谢您的帮助,但是您的答案生成了第二个表。正如我在问题中提到的,我知道如何创建第二个表(包含组)。我想做的是迭代每个组,并分别在每个组上应用业务逻辑。例如:仅当此组中的所有客户居住在同一城市并在同一地点工作时,才保留每个组中的第一行。为了找到这些信息,我需要看另一张表。我会更新我的问题。