【问题标题】:Percentage increase/decrease of a group of data in a mysql tablemysql表中一组数据的百分比增加/减少
【发布时间】:2016-08-04 18:36:22
【问题描述】:

我的桌子是这样的:

|| 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

【问题讨论】:

  • 能否请您展示一些示例数据和预期结果
  • MySQL 是否执行该查询?!?
  • 是的,它确实执行并正确生成了每个表/每年的分组。
  • 说实话,这在应用程序的较高层最容易实现——因为 MySQL 不支持分析函数,在数据库中实现它的唯一方法是使用涉及用户变量的 hack ...

标签: mysql sql


【解决方案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 中表达式的求值顺序,因此您不能安全地在多个表达式中使用变量(带赋值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2021-02-22
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多