Ale*_*lex 6 mysql group-by median
我有一个脚本,它计算所有表数据的中值:
SELECT avg(t1.price) as median_val FROM (
SELECT @rownum:=@rownum+1 as `row_number`, d.price
FROM mediana d, (SELECT @rownum:=0) r
WHERE 1
ORDER BY d.price
) as t1,
(
SELECT count(*) as total_rows
FROM mediana d
WHERE 1
) as t2
AND t1.row_number>=total_rows/2 and t1.row_number<=total_rows/2+1;
Run Code Online (Sandbox Code Playgroud)
现在我需要得到不是所有表值的中值,而是按日期分组.可能吗?http://sqlfiddle.com/#!2/7cf27 - 结果我将得到2013-03-06 - 1.5,2013-03-05 - 3.5.
fan*_*nts 10
我希望我没有放松自己并使事情过于复杂,但这就是我想出的:
SELECT sq.created_at, avg(sq.price) as median_val FROM (
SELECT t1.row_number, t1.price, t1.created_at FROM(
SELECT IF(@prev!=d.created_at, @rownum:=1, @rownum:=@rownum+1) as `row_number`, d.price, @prev:=d.created_at AS created_at
FROM mediana d, (SELECT @rownum:=0, @prev:=NULL) r
ORDER BY created_at, price
) as t1 INNER JOIN
(
SELECT count(*) as total_rows, created_at
FROM mediana d
GROUP BY created_at
) as t2
ON t1.created_at = t2.created_at
WHERE 1=1
AND t1.row_number>=t2.total_rows/2 and t1.row_number<=t2.total_rows/2+1
)sq
group by sq.created_at
Run Code Online (Sandbox Code Playgroud)
我在这里做的,主要是在日期改变时将rownumber重置为1(重要的是按created_at排序)并包括日期,以便我们可以按它分组.在计算总行数的查询中,我还包括created_at,因此我们可以加入两个子查询.
| 归档时间: |
|
| 查看次数: |
2872 次 |
| 最近记录: |