簡體   English   中英

如何在SQL Server 2008中的子組上進行迭代?

[英]How to iterate on subgroups in SQL Server 2008?

我有一張桌子像

顧客:

| 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 | street1 | 工作1 |

| 2 | street2 | 工作1 |

| 3 | street1 | 工作2 |

| 4 | street5 | 工作7 |

| 5 | street1 | 工作1 |

| 6 | street2 | 工作1 |

您會注意到,只有第一組中的客戶在同一地點生活和工作(客戶ID:1.5)。 如果您看第二組(客戶ID:2、3、6),他們就不會生活和工作在同一個地方。 該查詢的結果將是:客戶ID 5,因為它與客戶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;

看到這個SQLFiddle

我找不到任何方法可以在單個查詢中執行此操作。 我創建了一個游標,該游標可以完成我想做的事情:迭代一個表的所有行,應用業務邏輯並將相關的行插入輸出表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM