如何在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;
我找不到任何方法在一个查询中完成它。我已经创建了一个游标,它完成了我想要做的事情:迭代一个表的所有行,应用业务逻辑并将相关行插入输出表。我感谢您的帮助,但是您的答案生成了第二个表。正如我在问题中提到的,我知道如何创建第二个表(包含组)。我想做的是迭代每个组,并分别在每个组上应用业务逻辑。例如:仅当此组中的所有客户居住在同一城市并在同一地点工作时,才保留每个组中的第一行。为了找到这些信息,我需要看另一张表。我会更新我的问题。