我正在尝试从我的数据库中计算数据,但首先我注意到我得到的结果有奇怪的行为,其次,我无法提出考虑补充的请求。
我有一张桌子: 名称 - 日期时间 - 内容
我希望按天分组行并选择要消耗的数字的差异。 例如:
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个,我不知道为什么...... 我希望你的帮助改变我的要求并考虑补充,以便我得到我想要的结果。
谢谢!
答案 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)