Oracle SQL:将计数分为唯一列和非唯一列

Oracle SQL: Dividing Counts into unique and non unique columns

我有一个 table 看起来像这样:

|FileID|  File Info   |
| ---- | ------------ |
|   1  | X            |
|   1  | Y            |
|   2  | Y            |
|   2  | Z            |
|   2  | A            |

我想按 FileID 聚合并将文件信息列拆分为 2 个单独的计数列。我希望 1 列包含唯一文件信息的计数,另一列是非唯一文件信息的计数。

理想情况下,结果如下所示:

|FileID| Count(Unique)| Count(Non-unique) |
| ---- | ------------ | ----------------- |
|   1  | 1            | 1                 |
|   2  | 2            | 1                 |

其中非唯一计数是 'Y',唯一计数分别来自文件 ID 1 和 2 的 'X' 和 'Z, A'。

我正在寻找衡量文件之间而非内部唯一性的方法。

首先你 select 来自 table

的“非唯一”行
SELECT FileInfo
FROM sometableyoudidnotname
GROUP BY FileInfo
HAVING COUNT(*) > 1

现在您知道哪些是唯一的,哪些不是唯一的,您可以加入那个 table 以获得“状态”并计算它。

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

派生 table 计算每个文件 ID 的出现次数。 JOINGROUP 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

在每一行中使用 COUNT() window 函数来检查 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; 

参见demo