SQL基于条件的字段平均值

时间:2015-07-25 11:33:12

标签: mysql sql database relational-database reporting

我正在创建一个报告工具,它有一个我想在SQL世界中解决的特定要求。我使用的是MySQL 5.6.11: 我们有一些输入可以每天引入一次或两次:

DATETIME            | VALUE

01-01-2015 00:10:11 |   5 
01-03-2015 00:11:11 |   3
01-03-2015 00:12:11 |   4
01-03-2015 00:11:11 |   5
01-03-2015 00:12:11 |   8

我想通过以下方式获得值的平均值:

DATETIME   | FIRST INSERTED VALUE AVERAGE | SECOND INSERTED VALUE AVERAGE
01-01-2015 |          5                   | null
01-03-2015 |          4                   | 6

我们对所有记录的平均值感兴趣,但时间很重要。 我们希望列中所有报告的特定日期引入的第一个值的平均值和第二个引入的第二个值(如果有)的平均值。

这是一个报告的示例,没有考虑第一个值和第二个值之间的差异

SELECT AVG(bt.value), DATE(bt.date) 
    FROM reports bt
    GROUP BY DATE(bt.date) 

1 个答案:

答案 0 :(得分:0)

执行这样的换位操作相当困难,但我认为你可以使用GROUP_CONCAT得到你想要的东西。

首先,您必须按完整的DATETIME对结果进行分组,然后您可以通过DATE部分再次分组,同时将结果连接到averages列。最终的SELECT会将连接的字符串解析为不同的列。

SELECT date, SUBSTRING_INDEX(averages, '#', 1) FIRST,
   if (averages_count >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(averages, '#', 2), '#', -1), NULL) SECOND

FROM (SELECT DATE(derived.date) AS date, GROUP_CONCAT(derived.average SEPARATOR '#') AS averages, COUNT(*) AS averages_count
          FROM (SELECT bt.date AS date, AVG(bt.value) AS average
                    FROM reports AS bt
                    GROUP BY bt.date) AS derived
          GROUP BY DATE(date)) AS base

(我的灵感来自this answer)。