SQL AVG(计数(*))?
Posted
技术标签:
【中文标题】SQL AVG(计数(*))?【英文标题】:SQL AVG(COUNT(*))? 【发布时间】:2010-10-22 11:16:18 【问题描述】:我试图找出一个值在一列中出现的平均次数,根据另一列对其进行分组,然后对其进行计算。
我有3张桌子有点像这样
DVD
ID | NAME
1 | 1
2 | 1
3 | 2
4 | 3
COPY
ID | DVDID
1 | 1
2 | 1
3 | 2
4 | 3
5 | 1
LOAN
ID | DVDID | COPYID
1 | 1 | 1
2 | 1 | 2
3 | 2 | 3
4 | 3 | 4
5 | 1 | 5
6 | 1 | 5
7 | 1 | 5
8 | 1 | 2
等
基本上,我试图找到出现在贷款表中的所有副本 ID,其次数少于该 DVD 所有副本的平均次数。
所以在上面的例子中,dvd 1 的副本 5 出现 3 次,复制 2 两次,然后复制 1 一次,所以该 DVD 的平均值是 2。我想列出该 DVD 的所有副本(以及彼此)在 Loan 表中出现的数字小于该数字。
我希望这更有意义......
谢谢
【问题讨论】:
那么在你的例子中,应该返回什么结果数据集呢?是否应该为 DVDID=1 输出 2,为其他两个输出 1? ...因为说“一个值在列中出现的平均次数”没有任何意义。出现的次数就是出现的次数;你不能平均一个值。 对不起,我睡着了!我的意思是我想找出每张 DVD 的副本出现在外借表中的平均次数 @Dan:这已经不是很清楚了。请编辑您的问题并显示您想要的结果示例。 【参考方案1】:类似于 dotjoe 的解决方案,但使用解析函数来避免额外的连接。可能或多或少有效率。
with
loan_copy_total as
(
select dvdid, copyid, count(*) as cnt
from loan
group by dvdid, copyid
),
loan_copy_avg as
(
select dvdid, copyid, cnt, avg(cnt) over (partition by dvdid) as copy_avg
from loan_copy_total
)
select *
from loan_copy_avg lca
where cnt <= copy_avg;
【讨论】:
我最近看到了这种 'with' 语法。这是标准 SQL 还是在 Oracle 中? 它是 ANSI SQL 标准的一部分【参考方案2】:未经测试...
with
loan_copy_total as
(
select dvdid, copyid, count(*) as cnt
from loan
group by dvdid, copyid
),
loan_copy_avg as
(
select dvdid, avg(cnt) as copy_avg
from loan_copy_total
group by dvdid
)
select lct.*, lca.copy_avg
from loan_copy_avg lca
inner join loan_copy_total lct on lca.dvdid = lct.dvdid
and lct.cnt <= lca.copy_avg;
【讨论】:
【参考方案3】:这应该在 Oracle 中工作:
create view dvd_count_view
select dvdid, count(1) as howmanytimes
from loans
group by dvdid;
select avg(howmanytimes) from dvd_count_view;
【讨论】:
以上是关于SQL AVG(计数(*))?的主要内容,如果未能解决你的问题,请参考以下文章