我的表格如下:
|| date || bytes || table ||
我需要根据大小和年份计算出所有表格的年增长率(增加或减少百分比)。我有一个查询,它主要给我我想要的信息,我可以解析并使用外部工具来生成所需的数据,但我想知道是否有一种简单的方法直接在查询中执行百分比增加计算?
这就是我的查询现在的样子:
SELECT
YEAR(date) AS YEAR,
table,
SUM(bytes) / 1024 / 1024 / 1024 AS total
FROM
insertions
GROUP BY table, YEAR (date)
ORDER BY date;
是否可能有一个字段的当前表相对于上一年的百分比增加/减少?
示例输出:
| date | bytes | table |
| 2015 | 100 | accounting |
| 2016 | 150 | accounting |
| 2015 | 1 | it |
| 2016 | 100 | it |
随着百分比的增加,它应该看起来像:
| date | bytes | table | percentage
| 2015 | 100 | accounting | 0
| 2016 | 150 | accounting | 50
| 2015 | 1 | it | 0
| 2016 | 100 | it | 9900
答案 0 :(得分:1)
执行此操作的一种方法是使用变量来获取先前的值:
SELECT year, table, total,
(@prev := (case when (@new_prev := @prev) = null
then 'never go here'
when @t = table
then if(@prev := total, @new_prev, @new_prev)
when @t := table
then if(@prev := total, NULL, NULL)
end)
) as prev_total
FROM (SELECT YEAR(date) AS YEAR, table, SUM(bytes) / 1024 / 1024 / 1024 AS total
FROM insertions i
GROUP BY table, YEAR (date)
) yt CROSS JOIN
(SELECT @t := '', @prev := -1) params
ORDER BY table, date
其余的只是算术使用子查询来获得差异。
注意:这尤其具有挑战性,因为所有使用变量的公式都必须在单个表达式中。 MySQL不保证SELECT
中表达式的评估顺序,因此您无法安全地在多个表达式中使用变量(带有赋值)。