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 的出现次数。 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
在每一行中使用 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。
我有一个 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 的出现次数。 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
在每一行中使用 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。