sql - Oracle SQL - 如何对结果进行分组和聚合?

标签 sql oracle group-by

我正在尝试查询 Oracle 中的审核表,以列出文档在给定时间范围内的受欢迎程度(唯一点击数)。

到目前为止我开发的 SQL 是:

select distinct dt.name "Document name", ku.name "User name", count(*) "Number of hits" 
  from dauditnew da, 
       kuaf ku, 
       dtree dt 
 where ku.id=da.performerid 
   and (da.auditstr='Fetch') 
   and dt.dataid = ANY(DOCID1,DOCID2) 
   and da.dataid = ANY(DOCID1,DOCID2) 
   and da.auditdate between TO_DATE('01-JAN-12') and TO_DATE('31-OCT-12') 
 group by dt.name, ku.name

它会输出类似于以下内容的数据:

Document name       User name           Hit count
document1.pdf   rimnet\user1    1
document1.pdf   rimnet\user2    1
document1.pdf   rimnet\user3    17
document1.pdf   rimnet\user4    1
document2.pdf   rimnet\user5    1
document1.pdf   rimnet\user6    1
document3.pdf   rimnet\user7    1

但我真正需要的是它对结果进行分组并对每个唯一用户进行一次计数:

Document name       User name           Hit count
document1.pdf       n/a                 5
document2.pdf       n/a                 1
document3.pdf       n/a                 1

有人能指出我正确的方向吗?

最佳答案

根据您想要的结果,听起来您只想要用户计数而不是点击次数(否则,聚合 17 个点击 + 1 个点击 + 1 个点击 + 1 个点击是没有意义的+ 1 次命中,最终得到 5 次命中)。如果是这样的话

select dt.name "Document name", count(distinct ku.name) "Distinct users" 
  from dauditnew da, 
       kuaf ku, 
       dtree dt 
 where ku.id=da.performerid 
   and (da.auditstr='Fetch') 
   and dt.dataid = ANY(DOCID1,DOCID2) 
   and da.dataid = ANY(DOCID1,DOCID2) 
   and da.auditdate between TO_DATE('01-JAN-12') and TO_DATE('31-OCT-12') 
 group by dt.name

关于sql - Oracle SQL - 如何对结果进行分组和聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295520/

相关文章:

json - 在 PostgreSQL 中聚合 JSON

sql - 如何根据合并列的值过滤分组查询?

mysql - 是否可以在 MySQL 中创建具有 UNIX_TIMESTAMP 默认值的列?

mysql - 在 MySQL 中的子字符串之间提取文本

sql - 链接 Access 数据库 "record has been changed by another user"

java - 如何从 jdbc 调用存储函数?

sql - 分组依据汇总和计数(不同)

sql - 如何在 sqlite 中使用 like 运算符进行复杂查询

java - JDBC类型滚动不敏感和敏感

SQL 如果存在则选择任何其他记录,如果没有其他则选择默认值