我最近遇到了一個問題,我必須按具有相似值的 2 列進行分組。列可以隨時交換值,但我仍然需要對它們進行分組。
例如,考慮有一個二人組完成某些任務
COL 1 | COL 2 | COL 3
User 1 | User 2 | Task 1
User 1 | User 2 | Task 2
User 1 | User 2 | Task 3
User 2 | User 1 | Task 4
在上面的例子中,用戶 1 和用戶 2 一起作業了 4 次,完成了 4 個任務。我在 COL1 和 COL2 上使用了 GROUP BY,但它對前 3 個結果進行了分組,并且由于列交換了值而忽略了第四個結果。我該如何處理?
uj5u.com熱心網友回復:
你可以做這樣的事情。獲取所有可能的組合并根據用戶 ID 采取一種條件。我沒有處理過 null 但如果這是一個要求,你可以使用nvl或coalesce添加一個虛擬值來處理這些情況
SELECT COL1, COL2, COUNT(TASK) FROM
(
SELECT COL1, COL2, TASK FROM users
UNION
SELECT COL2, COL1, TASK FROM users
)a WHERE COL1 < COL2 OR COL1 = COL2
GROUP BY COL1,COL2
輸出:
User1 User2 4
Sql小提琴
uj5u.com熱心網友回復:
交換兩列,使較小的值變為 col1,另一個值變為 col2,然后分組:
SELECT col1_new, col2_new, COUNT(*) AS c
FROM t
CROSS APPLY (SELECT
CASE WHEN col1 <= col2 OR col1 IS NULL THEN col1 ELSE col2 END,
CASE WHEN col1 <= col2 OR col1 IS NULL THEN col2 ELSE col1 END
) AS x(col1_new, col2_new)
GROUP BY col1_new, col2_new
如果CROSS APPLY或 橫向連接不可用,則您需要復制粘貼 select 和 group by 子句中的運算式。
uj5u.com熱心網友回復:
使用least()和greatest()確保 col1 用戶 < col2 用戶。然后GROUP BY:
select least(COL1, COL2), greatest(COL1, COL2), count(*)
from tablename
group by least(COL1, COL2), greatest(COL1, COL2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363137.html
標籤:sql
