mysql - SQL 查询 (MAX-MIN) 显示错误结果

标签 mysql sql database select

我正在尝试从数据库中计算数据,但首先我从得到的结果中注意到了奇怪的行为,其次,我在提出考虑补充的请求时遇到了困难。

我有一张 table : 名称 - 日期时间 - 内容

我想按天对行进行分组,并选择数字的差异来进行消耗。 例如:

Name - DateTime - Content
Foo - 22-04-2018 6:00 - 120
Foo - 22-04-2018 10:00 - 119
Foo - 22-04-2018 16:00 - 118

内容减少了,结果应该是-2。 我的请求的输出 = -2

另一个例子:

Name - DateTime - Content
Foo - 23-04-2018 6:00 - 50
Foo - 23-04-2018 10:00 - 90
Foo - 23-04-2018 16:00 - 120

在这里我们可以注意到数量增加了。意思是我们不是消费了,而是补充了储备,内容增加了。 结果应该是-70。 我的请求的输出:30

我的要求:

SELECT day, 
       Abs(Sum(diffn)) AS totN 
FROM   (SELECT Date(datetime)              AS day, 
               Max(content) - Min(content) AS diffN 
        FROM   logs 
        WHERE  NAME = 'Foo' 
               AND datetime >= '2018-04-22 00:00:00' 
               AND datetime <= '2018-04-23 00:00:00' 
        GROUP  BY Date(datetime)) a 
GROUP  BY day; 

但是对于第二个例子,我的结果是 30 而不是 70,我不知道为什么...... 我希望您帮助更改我的请求并考虑补充,以便我得到我想要的结果。

谢谢!

最佳答案

您需要通过比较最高值和最低值(包括时间(小时))来确定前缀。我在这里使用带有两个子查询的“CASE”函数。

也许您需要颠倒年月日,因为我使用的是德语日期时间格式。

SET @datetime = '2018-04-22';

SELECT date(datetime) as day
    ,(CASE WHEN
     (SELECT content FROM logs WHERE date(datetime) = @datetime ORDER BY datetime LIMIT 1)
        >
     (SELECT content FROM logs WHERE date(datetime) = @datetime ORDER BY datetime desc LIMIT 1)
       THEN min(content) - max(content)
       ELSE max(content) - min(content) END) as diffN
    FROM logs 

    WHERE Name = 'Foo' AND date(datetime) = @datetime
    GROUP BY day(datetime)
    ORDER BY datetime
    ;

关于mysql - SQL 查询 (MAX-MIN) 显示错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49977408/

相关文章:

c# - 在 C# 中创建数据库

mysql - 如何计算从页表中获取的记录数?

php - 将数据从一个 MySQL 数据库导入到另一个 MySQL 数据库?

php - 每隔一定时间用从 mysql 检索到的数据刷新 ListView

mysql - 如何将 system.data.dataRow 值转换为整数

mysql - 在MYSQL中,行数多好还是列数多好?

java - 如何使用mysql查询返回计数?

sql - 对于每个国家,找到人口最多的城市和该城市的人口

mysql - MySQL 表连接中的 "using"和 "on"有什么区别?

database - 在给定半径内搜索相应对象位置的酒店(Gem Geocoder)