因此,例如,我們有許多具有不同組 ID 的用戶。其中一些沒有組:
userID groupID
-------------
user1 group1
user2 group1
user3 group2
user4 group1
user5 NULL
user6 NULL
user7 NULL
user8 NULL
我們需要按用戶的 groupID 對用戶進行分組。并且我們希望沒有組的用戶(groupID 等于 NULL)被分配到現有組之一(在本例中為 group1 或 group2)。但是我們希望根據已分配給這些組的用戶數量按比例分配它們。在我們的示例中,group1 有 3 個用戶,group2 只有 1 個用戶。所以 75% (3/4) 的新用戶應該被算作組 1 的成員,另外 25% (1/4) 應該被“添加”到組 2 中。最終結果應如下所示:
groupID numOfUsers
-------------
group1 6
group2 2
這是一個簡化的例子。基本上我們只是無法弄清楚沒有組的用戶如何按一定比例在組之間進行劃分,而不僅僅是在它們之間均勻分布。
我們可以擁有任意數量的組和用戶,因此我們不能只對百分比進行硬編碼。任何幫助表示贊賞。
編輯:我嘗試使用 NTILE(),但它提供了均勻分布,與組中的用戶數量不成正比
SELECT userID ,
NTILE(2) OVER( ) gr
from(
select DISTINCT userID
from test_task
WHERE groupID IS NULL ) AS abc
uj5u.com熱心網友回復:
這是一種方法:
select
groupid
, count(*)
round(count(*) / sum(count(*)) over(),0) * (select count(*) from table where groupid ='no_group')
from table
where groupid <> 'no_group'
group by groupid
uj5u.com熱心網友回復:
我們可以使用可更新的 CTE 來做到這一點
- 首先,我們獲取所有現有資料,將其分組
groupID,并計算行數的運行總和,以及整個集合的總行數 - 我們取我們想要更新的行并添加一個行號(減 1 以便計算作業)
- 根據該行號加入這兩個模數,現有總行數應介于之前的運行總和和當前的運行總和之間
- 請注意,這僅在行數可整除時才有效,例如。4 或 8,按 4 個現有行
WITH Groups AS (
SELECT
groupID,
perGroup = COUNT(*),
total = SUM(COUNT(*)) OVER (),
runningSum = SUM(COUNT(*)) OVER (ORDER BY groupID ROWS UNBOUNDED PRECEDING)
FROM test_task
WHERE groupID IS NOT NULL
GROUP BY groupID
),
ToUpdate AS (
SELECT
groupID,
userID,
rn = ROW_NUMBER() OVER (ORDER BY userID) - 1
FROM test_task tt
WHERE groupID IS NULL
)
UPDATE u
SET groupID = g.groupID
FROM ToUpdate u
JOIN Groups g
ON u.rn % (g.total) >= g.runningSum - g.perGroup
AND u.rn % (g.total) < g.runningSum;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/333476.html
標籤:sql-server 查询语句
上一篇:在GROUPBY查詢中劃分值
