[英]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;
我找不到任何方法可以在單個查詢中執行此操作。 我創建了一個游標,該游標可以完成我想做的事情:迭代一個表的所有行,應用業務邏輯並將相關的行插入輸出表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.