2009-04-29 3 views
6

Bir sütunda bir değerin göründüğü ortalama süreyi bulmaya çalışıyorum, onu başka bir sütuna göre gruplandırın ve sonra üzerinde bir hesaplama yapın.SQL AVG (COUNT (*))?

biraz Temelde bu

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 

vb

gibi 3 tablolar var, ortalama olarak kaç kez sayısından daha kredi tablosunda AZ kez görünür tüm kopya kimlikleri bulmaya çalışıyorum DVD'nin tüm kopyaları için.

Yukarıdaki örnekte, DVD 1'in 5'i 3 kez görüntülenir, 2'yi iki kez kopyalayın ve 1'i bir kez kopyalayın, böylece bu DVD'nin ortalaması 2'dir. Bu dosyanın tüm kopyalarını listelemek istiyorum (ve diğeri) Kredi tablosunda bu sayıdan daha az görünür. Bunun biraz daha mantıklı umut

...

Teşekkür

Bu Oracle'da çalışmalıdır
+0

Örneğinizde, hangi sonuç kümesi döndürülmeli? DVDID = 1 için 2, diğer ikisi için 1 mi? –

+1

... çünkü 'bir sütunda bir değerin göründüğü ortalama sayı' ifadesinin bir anlamı yoktur. Görünenlerin sayısı, görüntülenme sayısıdır; Bir değeri ortalama edemezsin. –

+0

Üzgünüm, yarı uykum var! Her bir DVD'nin kopyalarının Kredi tablosunda –

cevap

2

:

create view dvd_count_view 
select dvdid, count(1) as howmanytimes 
    from loans 
group by dvdid; 

select avg(howmanytimes) from dvd_count_view; 
2

Untested ...

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; 
2

benzer dotjoe'un çözümü, ancak ekstra birleşimden kaçınmak için bir analitik işlev kullanmak. Daha fazla veya daha az verimli olabilir.

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; 
+0

Son zamanlarda bu 'ile' sözdizimini görüyorum. Bu standart SQL mi yoksa Oracle'da mı? –

+0

Bu, ANSI SQL standardının bir parçasıdır –