[英]Sql server: limit string_agg result
我有以下查詢(為每個客戶顯示用戶列表):
select cu.customer_id , STRING_AGG(u.first_name + ' ' + u.last_name , ',') as users
from customer_user cu join user u on cu.user_id = u.id
where ...
group by cu.customer_id
如何限制 string_agg function 為每個組僅聚合 10 個元素?
您可以嘗試對行進行編號:
SELECT customer_id , STRING_AGG(first_name + ' ' + last_name , ',') AS users
FROM (
SELECT
cu.customer_id, u.first_name, u.last_name,
ROW_NUMBER() OVER (PARTITION BY cu.customer_id ORDER BY (SELECT NULL)) AS rn
FROM customer_user cu
JOIN user u ON cu.user_id = u.id
-- WHERE ...
) t
WHERE rn <= 10
GROUP BY customer_id
同樣,這是另一種情況,我發現在 CTE 中分離邏輯的“丑陋”部分(串聯並確定“第一個”或“任何”10),然后直到之后才聚合:
; -- see sqlblog.org/cte
WITH src AS
(
SELECT cu.customer_id, n = CONCAT(u.first_name, ' ', u.last_name),
rn = ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY @@SPID)
FROM dbo.customer_user AS cu
INNER JOIN dbo.[user] AS u -- bad table name
ON cu.user_id = u.id
/* WHERE ... */
)
SELECT customer_id, users = STRING_AGG(n, N',')
FROM src
WHERE rn <= 10
GROUP BY customer_id;
我們可以在子查詢中使用 row_number。 我在這個例子中限制為 2,您可以將 rn 的限制更改為 10 或其他數字。
我顯示第一個查詢沒有限制,第二個查詢有限制以顯示差異。
create table users( id int, first_name varchar(25), last_name varchar(25) ); insert into users values (1,'Andrew','A'), (2,'Bill','B'), (3,'Charlie','C'); create table customer_user( customer_id int, user_id int); insert into customer_user values (1,1),(1,2),(1,3); GO
6 行受影響
select cu.customer_id, STRING_AGG(u.first_name + ' ' + u.last_name, ',') as users from customer_user cu join users u on cu.user_id = u.id group by cu.customer_id
GO
客戶編號 | 用戶 ----------: |:------------------------ 1 | 安德魯 A、比爾 B、查理 C
select u.customer_id, STRING_AGG(u.first_name + ' ' + u.last_name, ',') as users from ( select row_number() over(partition by customer_id order by u.id) rn, cu.customer_id, u.first_name, u.last_name from customer_user cu join users u on cu.user_id = u.id ) u where rn < 3 group by u.customer_id GO
客戶編號 | 用戶 ----------: |:------------ 1 | 安德魯 A,比爾 B
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.