我有一個看起來像這樣的表:
|FileID| File Info |
| ---- | ------------ |
| 1 | X |
| 1 | Y |
| 2 | Y |
| 2 | Z |
| 2 | A |
我想按 FileID 聚合并將 File Info 列拆分為 2 個單獨的計數列。我希望一列具有唯一檔案資訊的計數,另一列是非唯一檔案資訊的計數。
理想情況下,結果如下所示:
|FileID| Count(Unique)| Count(Non-unique) |
| ---- | ------------ | ----------------- |
| 1 | 1 | 1 |
| 2 | 2 | 1 |
其中非唯一計數是“Y”,唯一計數分別來自 FileID 1 和 2 的“X”和“Z,A”。
我正在尋找方法來衡量檔案之間而不是內部的唯一性。
uj5u.com熱心網友回復:
在每一行中使用COUNT()視窗函式來檢查是否FileInfo是唯一的,然后使用條件聚合來獲得你想要的結果:
SELECT FileID,
COUNT(CASE WHEN counter = 1 THEN 1 END) count_unique,
COUNT(CASE WHEN counter > 1 THEN 1 END) count_non_unique
FROM (
SELECT t.*, COUNT(*) OVER (PARTITION BY t.FileInfo) counter
FROM tablename t
) t
GROUP BY FileID;
請參閱演示。
uj5u.com熱心網友回復:
首先,您從表中選擇“非唯一”行
SELECT FileInfo
FROM sometableyoudidnotname
GROUP BY FileInfo
HAVING COUNT(*) > 1
現在您知道哪些是唯一的和非唯一的,您可以離開該表以獲取“狀態”并對其進行計數。
SELECT base.FileID,
SUM(CASE WHEN u.FileID is NOT NULL THEN 1 ELSE 0 END) as nonunique,
SUM(CASE WHEN u.FileID is NULL THEN 1 ELSE 0 END) as unique
FROM sometableyoudidnotname base
LEFT JOIN (
SELECT FileInfo
FROM sometableyoudidnotname
GROUP BY FileInfo
HAVING COUNT(*) > 1
) u ON base.FileInfo = u.FileInfo
GROUP BY base.FileID
uj5u.com熱心網友回復:
有一個派生表來計算每個 fileid 的出現次數。JOIN和GROUP BY:
select t1.FileID,
sum(case when t2.ficount = 1 then 1 else 0 end),
sum(case when t2.ficount > 1 then 1 else 0 end)
from tablename t1
join
(
select fileinfo, count(*) ficount
from tablename
group by fileinfo
) t2
on t1.fileinfo = t2.fileinfo
group by t1.FileID
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/435446.html
上一篇:關于如何表達一對多關系的解釋
