簡體   English   中英

Sql 服務器:限制 string_agg 結果

[英]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.

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