排除重复值

时间:2019-07-18 17:53:11

标签: sql oracle oracle12c

我试图不对用户进行多次计数,我只想对它计数一次。因此,即使用户与多个应用程序相关联,我也只希望对用户进行一次计数,而不是4次。

我正在使用Oracle Oracle Database 12c企业版12.2.0.1.0

表结构如下:

Application | User
--------------------
Windows     |  James
Linux       |  James
AppleOS     |  James
Android     |  James

我尝试在数量上做一个独特的尝试,但这似乎无济于事。

select distinct b.application, b.user, count(distinct u.user) as count
from book b
where b.application IN ('Windows','Linux','AppleOS','Android')
group by b.application, b.user

我所看到的

Application | User   |  Count
-----------------------------------
Windows     |  James |    1
Linux       |  James |    1
AppleOS     |  James |    1
Android     |  James |    1

我希望看到的:

Application | User   |  Count
-----------------------------------
Windows     |  James |    1
Linux       |  James |
AppleOS     |  James | 
Android     |  James |

2 个答案:

答案 0 :(得分:0)

您可以使用row_number()为用户计算一个应用程序:

select b.application, sum(case when seqnum = 1 then 1 else 0 end) as cnt
from (select b.*, row_number() over (partition by user order by user) as seqnum
      from book b
      where b.application in ('Windows', 'Linux', 'AppleOS', 'Android')
     ) b
group by b.application;

这将为“ 1”值选择任意行。您可以使用order by来更具体,例如order by b.application desc

答案 1 :(得分:0)

最紧凑的查询是使用ROW_NUMBER分析函数为一个用户内的应用程序分配唯一的序列号。

CASE语句中,您仅对数字1的行进行计数-这可确保每个用户只被计算一次。

ORDER BY子句中,定义将为计数选择哪个应用程序(我使用的是应用程序的字母顺序)。

select 
Application,
User_name,
case when row_number() over (partition by User_name order by Application) = 1
    then 1 end as cnt
from tab
;


APPLICA USER_        CNT
------- ----- ----------
Android James          1
AppleOS James           
Linux   James           
Windows James           
Android Bond           1