[英]Viewing counts for all users in an activity table by the day without losing users who have 0 counts
[英]How to find 'members' who have a higher number of 'counts' than the average 'count' for all users?
我有兩個桌子。 成員和流。 我想查找所有成員的平均流數,然后查看哪些單個成員(包括名字)流過的數據流大於平均流數。
目前,我有這個查詢,可以找到平均流數和每個成員擁有的流數;
select stream.m_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID;
我正在努力尋找如何丟棄流數量少於平均數量的成員並將成員和流表連接在一起的方法
CREATE TABLE "M_5006677"."MEMBER"
( "M_ID" NUMBER(2,0),
"FNAME" VARCHAR2(15 BYTE) NOT NULL ENABLE,
"MNAME" VARCHAR2(15 BYTE),
"LNAME" VARCHAR2(15 BYTE) NOT NULL ENABLE,
"EMAIL" VARCHAR2(25 BYTE) NOT NULL ENABLE,
"R_DATE" DATE NOT NULL ENABLE,
"L_DATE" DATE,
CONSTRAINT "PK_M_ID" PRIMARY KEY ("M_ID")
CREATE TABLE "M_5006677"."STREAM"
( "STREAM_ID" NUMBER(2,0),
"SDATE" DATE,
"SPOSITION" NUMBER(5,2),
"F_ID" NUMBER(2,0) NOT NULL ENABLE,
"M_ID" NUMBER(2,0) NOT NULL ENABLE,
"LIVE" VARCHAR2(3 BYTE),
CONSTRAINT "PK_STREAM" PRIMARY KEY ("STREAM_ID")
CONSTRAINT "FK_F_ID" FOREIGN KEY ("F_ID") REFERENCE FILM
CONSTRAINT "FK_M_ID" FOREIGN KEY ("M_ID") REFERENCE MEMBER
我會使用窗口功能。 如果您只想統計曾經直播過的成員:
select m_id
from (select m_id, count(*) as cnt, avg(count(*)) over () as avg_overall
from streams
group by m_id
) s
where cnt > avg_overall;
如果要計算從未流過的成員:
select m_id
from (select m_id, count(*) as cnt, avg(count(s.m_id)) over () as avg_overall
from members m left join
streams s
on m.m_id = s.m_id
group by m_id
) s
where cnt > avg_overall;
這將適用於SQL Server:
select stream.m_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID
having count(*) < (select avg (count(*)) from stream group by stream.m_ID)
如果您還希望獲取有關成員的數據,則應在查詢中包含M_ID,以便可以像這樣與members表聯接:
select stream.m_ID, M_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID ,M_ID
having count(*) < (select avg (count(*)) from stream group by stream.m_ID)
之后,您可以使用Members表加入M_ID:
select FNAME from Member m
join (select stream.m_ID, M_ID, count(*), (select avg (count(*)) from stream
group by stream.m_ID) from stream group by stream.m_ID ,M_ID
having count(*) < (select avg (count(*)) from stream group by
stream.m_ID)) X on m.M_ID = X.M_ID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.