我有一张有appox的桌子。 450,000条记录。我必须找到非gmail用户每个用户每天的平均数据使用量。 gmail,facebook,yahoo.etc等应用程序名称将在“名称”字段中捕获。如果'name'的值为'gmail',另一个名为'label'的字段会将值捕获为'D',表示它正在捕获数据使用情况并在其他两个字段中更新它(Datausage1,datausage2)。我不能在同一个where子句中使用'name'和'label',因为在'label'中捕获了其他值。因此,我已经加入了如下表格,但查询效率不高,并且运行了很长时间。有没有其他方法可以获得所需的结果?
(选择
t1.network AS Network,
(((SUM(t2.datausage1)+ SUM
(t2.datausage2))/ 1073741824)/ EXACT_COUNT_DISTINCT(t1.user))/ 33 AS Avg_data_GigaBytes_Per_day_Per_User,
来自
(SELECT用户,StartTime,
网络
来自[mytable]
姓名不在的地方('gmail')
)t1
加入
(SELECT user,datausage1,datausage2
来自[mytable]
WHERE label ='T'
)t2
ON t1.user = t2.user
GROUP BY 1
)
答案 0 :(得分:1)
尝试以下
SELECT
network,
AVG(usage_per_day_by_user) AS usage_per_day_per_user_average
FROM (
SELECT
network,
user,
DATE(StartTime) AS usage_day,
SUM(t2.datausage1 + t2.datausage2)/1073741824 AS usage_per_day_by_user
FROM [mytable]
WHERE NOT name IN ('gmail')
AND label = 'D'
GROUP BY 1, 2, 3
)
GROUP BY network
下面的陈述不清楚,所以我暂时忽略了它
I cannot have 'name' and 'label' in the same where clause as there are other values that are captured in 'label'
顺便说一下,我看到你的查询的主要问题是它为同一个用户生成条目的交叉连接。所以基本上你的0.5M行变成了MM行,然后就会看起来很慢
答案 1 :(得分:0)
您的查询缺少一些细节,但听起来您需要条件求和而不是连接。有点像:
SUM(IF(name='gmail' AND label='D',datausage1+datausage2,<however you calculate the non-gmail case>))