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

时间:2018-04-23 09:18:10

标签: mysql sql database select

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

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

我希望按天分组行并选择要消耗的数字的差异。 例如:

mBinding.mainAction.getButton.setOnClickListener(view -> Timber.e("test");

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

另一个例子:

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

我们在这里可以注意到这个数字已经增加了。这意味着我们不是消费,而是重新填充储备,内容也增加了。 结果应该是-70。 我的要求输出:30

我的要求:

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

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

谢谢!

4 个答案:

答案 0 :(得分:1)

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

也许你需要把年月日变成现在,因为我正在使用德语日期时间格式。

{{1}}

答案 1 :(得分:0)

你为什么第二次将它分组:

理想情况下,这应该有效:

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) 

此查询的结果将只包含2行 - 第22行为1,第23天为1。白天不需要再分组

答案 2 :(得分:0)

这应该做的工作:

SELECT day(datetime) as day, max(content) - min(content) as diffN
FROM logs 
WHERE Name = 'Foo' 
AND datetime >= '2018-04-23 00:00:00' 
AND datetime <= '2018-04-24 00:00:00' 
GROUP BY day(datetime) 

另外,更改日期过滤器应该在23和24之间。

答案 3 :(得分:0)

您可能需要建立第一个和最后一个日期时间及其相关内容。例如

drop table if exists t;
create table t (name varchar(3), dt datetime, content int);
insert into t values
('Foo' , '2018-04-22 06:00:00', 120),
('Foo' , '2018-04-22 10:00:00', 119),
('Foo' , '2018-04-22 16:00:00', 118),
('Foo' , '2018-04-23 06:00:00', 50),
('Foo' , '2018-04-23 10:00:00', 90),
('Foo' , '2018-04-23 16:00:00', 120);

select s.name,lastinday,firstinday,lastinday - firstinday
from 
(
select name,dt, content lastinday
from t
where dt = (Select max(dt) from t t1 where t1.name = t.name and date(t1.dt) = date(t.dt))
) s
join
(
select name,dt, content firstinday
from t
where dt = (Select min(dt) from t t1 where t1.name = t.name and date(t1.dt) = date(t.dt))
) t
on t.name = s.name and date(t.dt) = date(s.dt);

+------+-----------+------------+------------------------+
| name | lastinday | firstinday | lastinday - firstinday |
+------+-----------+------------+------------------------+
| Foo  |       118 |        120 |                     -2 |
| Foo  |       120 |         50 |                     70 |
+------+-----------+------------+------------------------+
2 rows in set (0.00 sec)