有一個請求,我們需要從每個組中挑選分配任務最少的人。像這樣:
收到一個新任務。A組有10名員工。員工 ABC 在 10 個任務中分配的任務數量最少,因此 ABC 將分配給這個新收到的任務。
我的表具有以下結構:
Group Employee Task
A John Walk the dog
A Jane Pet the cat
A Jane Feed the chicken
B Mozart Play violin
B Mozart Play something
B Bach Fix piano
C James Cook Eggs
C James Fry something
C Emma Salad
C Emma Hummus
如果收到 A 組的新任務,演算法會選擇 John,因為他只有 1 個任務。如果收到 B 組的新任務,演算法會選擇 Back,因為他只有 1 個任務。如果收到 C 組的新任務,我們如何使用 order ASC 選擇一個,因為他們都有 2 個任務?
有人知道怎么做嗎?
謝謝
uj5u.com熱心網友回復:
COUNT()我們可以使用和的組合來實作這一點ROW_NUMBER():
WITH cte1 AS (
SELECT t.*, COUNT(*) OVER (PARTITION BY "Group", Employee) cnt
FROM yourTable t
),
cte2 AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION "Group" ORDER BY cnt) rnk
FROM cte1 t
)
SELECT "Group", Employee, Task
FROM cte2
WHERE rnk = 1
ORDER BY "Group", Employee;
第一個 CTE 分配每個組內的員工任務計數。第二個 CTE 根據每個員工的任務數量對記錄進行排名。
uj5u.com熱心網友回復:
在組中查找任務數量最少的員工,如果有多個,則除非您有另一個可用于分配任務的指標,否則請從任務數量最少的員工中隨機挑選員工:
SELECT Employee
FROM table_name
WHERE "GROUP" = 'C'
GROUP BY Employee
ORDER BY COUNT(*) ASC, DBMS_RANDOM.VALUE()
FETCH FIRST ROW ONLY;
其中,對于您的示例資料:
CREATE TABLE table_name ("GROUP", Employee, Task) AS
SELECT 'A', 'John', 'Walk the dog' FROM DUAL UNION ALL
SELECT 'A', 'Jane', 'Pet the cat' FROM DUAL UNION ALL
SELECT 'A', 'Jane', 'Feed the chicken' FROM DUAL UNION ALL
SELECT 'B', 'Mozart', 'Play violin' FROM DUAL UNION ALL
SELECT 'B', 'Mozart', 'Play something' FROM DUAL UNION ALL
SELECT 'B', 'Bach', 'Fix piano' FROM DUAL UNION ALL
SELECT 'C', 'James', 'Cook Eggs' FROM DUAL UNION ALL
SELECT 'C', 'James', 'Fry something' FROM DUAL UNION ALL
SELECT 'C', 'Emma', 'Salad' FROM DUAL UNION ALL
SELECT 'C', 'Emma', 'Hummus' FROM DUAL;
可以選擇:
| 員工 |
|---|
| 詹姆士 |
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532684.html
標籤:sql甲骨文
