我试图不对用户进行多次计数,我只想对它计数一次。因此,即使用户与多个应用程序相关联,我也只希望对用户进行一次计数,而不是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 |
答案 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