我需要计算列中给定值的数据集中出现的平均值。我做了一个简单的例子,但在我当前的数据库中包含大约2个内部联接,以将其减少到100k记录。我需要为10列执行以下select distinct语句。
我当前的设计强制每列的内连接。另一个限制是我需要在此示例中为每个名称执行至少50-100行。
我需要找出一种有效的方法来计算这些值,而不会在快速查询时使用太多资源。
http://sqlfiddle.com/#!9/c2378/3
我的预期结果是:
Name | R Avg dir | L Avg dir 1 | L Avg dir 2 | L Avg dir 3
A 0 .5 .25 .25
创建表格查询:
CREATE TABLE demo
(`id` int, `name` varchar(10),`hand` varchar(1), `dir` int)
;
INSERT INTO demo
(`id`, `name`, `hand`, `dir`)
VALUES
(1, 'A', 'L', 1),
(2, 'A', 'L', 1),
(3, 'A', 'L', 2),
(4, 'A', 'L', 3),
(5, 'A', 'R', 3),
(6, 'A', 'R', 3)
;
示例查询:
SELECT distinct name,
COALESCE(( (Select count(id) as 'cd' from demo where hand = 'L' AND dir = 1) /(Select count(id) as 'fd' from demo where hand = 'L')),0) as 'L AVG dir'
FROM
demo
where hand = 'L' AND dir = 1 AND name = 'A'
答案 0 :(得分:1)
一种选择是使用conditional aggregation
:
SELECT name,
count(case when hand = 'L' and dir = 1 then 1 end) /
count(case when hand = 'L' then 1 end) L1Avg,
count(case when hand = 'L' and dir = 2 then 1 end) /
count(case when hand = 'L' then 1 end) L2Avg,
count(case when hand = 'L' and dir = 3 then 1 end) /
count(case when hand = 'L' then 1 end) L3Avg,
count(case when hand = 'R' and dir = 3 then 1 end) /
count(case when hand = 'R' then 1 end) RAvg
FROM demo
WHERE name = 'A'
GROUP BY name
请注意,我并非100%确定您希望RAvg
为0的原因 - 我认为您的意思是100%。如果没有,您可以相应调整上述内容。