我如何在 MySQL 嵌套 Select 查询中 "reset" 变量(SUM(x) 作为变量)
How can i "reset" a variable (SUM(x) as Variable) in a MySQL nested Select Query
我一直在设法解决这个 MySQL-Riddle,我想我还不清楚。
我有一个 Table 具有以下结构(即):
ID | Date | Attr1 | Attr2
1 | 2018-01-31 12:00:00 | 5 | 7
2 | 2018-01-31 12:10:00 | 4 | 3
3 | 2018-01-31 12:20:00 | 0 | 7
...
...
k | 2018-02-01 00:00:00 | 4 | 5
k+1| 2018-02-01 00:10:00 | 1 | 3
...
等等...
我正在尝试将 SUM(Attr1) 计算为 S1,将 SUM(Attr2) 计算为 S2,以及这些值之间的差值 (S1-S2)。我已经通过使用 "Self-Inner Join" 实现了它(如 here 所述)。
我还没有解决的问题是:我得到了值的全部 ( w h o l e ) SUM,我想在日期改变时重置这个 S1 和 S2。我有几个月的条目,手动完成对我来说不是一个好的选择。
你有什么建议吗?感谢您的留言和帮助。我的 SQL 级别是初中级,我不记得怎么做了。
非常感谢您的帮助。
编辑:
我的预期输出是
ID | Date | Attr1 | Attr2 | S1 | s2 | S1 -S2
1 | 2018-01-31 12:00:00 | 5 | 7 | 5 | 7 | -2
2 | 2018-01-31 12:10:00 | 4 | 3 | 9 | 10 | -1
3 | 2018-01-31 12:20:00 | 0 | 7 | 9 | 17 | -8
...
...
k | 2018-02-01 00:00:00 | 4 | 5 | 4 | 5 | -1
k+1| 2018-02-01 00:10:00 | 1 | 3 | 5 | 8 | -3
...
编辑 2:我分享了我尝试过但没有成功的内容:
select t1.id, t1.date, t1.attr1, t1.attr2,
t2.id, t2.date, t2.attr1, t2.attr2,
sum(t2.attr1) as cumAttr1,
sum(t2.attr2) as cumAttr2,
sum(t2.attr1) - sum(t2.attr2) as diffAttrs
from table t1
inner join table t2
on t1.date >= t2.date
group by t1.id, t1.attr1
order by t1.date
有了这个,我将得到整组行及其总和,但我想每天重置 "sum" 值。
再次感谢您的反馈。
编辑 2:
我已经意识到,使用存储过程可以获得相同的结果并且在我这边(facepalm)多一点点顺序。 *没有*必要尝试用一个 SELECT
完成所有事情
大家好。感谢一切!
这是你想要的吗?
select date(date), sum(attr1), sum(attr2),
sum(attr1) - sum(attr2) as diff
from t
group by date(date);
我不明白 self-join 与这个问题有什么关系。
编辑:
你好像要的是累计和。对于整个问题,我会这样处理:
select t.*,
(select sum(tt1.attr1)
from t tt1
where tt1.date <= t.date
) as running_attr1,
(select sum(tt2.attr2)
from t tt2
where tt2.date <= t.date
) as running_attr2
from t;
要每天重新开始,只需在 where
子句中添加:
select t.*,
(select sum(tt1.attr1)
from t tt1
where date(tt1.date) = date(t.date) and tt1.date <= t.date
) as running_attr1,
(select sum(tt2.attr2)
from t tt2
where date(tt2.date) = date(t.date) and tt2.date <= t.date
) as running_attr2
from t;
没有看到您的原始查询,我无法确定您的查询有多接近;但这应该是获得指定结果的最简单的 self-join 查询。
SELECT t.ID, t.Date, t.Attr1, t.Attr2
, SUM(tPrev.Attr1) AS S1, SUM(tPrev.Attr2) AS S2
, SUM(tPrev.Attr1)-SUM(tPrev.Attr2) AS `S1 -S2`
FROM t AS t
LEFT JOIN t AS tPrev
ON DATE(t.Date) = DATE(tPrev.Date) -- Get records from the day of t
AND tPrev.Date <= t.Date -- But only ones earlier in the day, or t itself
GROUP BY t.ID, t.Date, t.Attr1, t.Attr2
;
我一直在设法解决这个 MySQL-Riddle,我想我还不清楚。
我有一个 Table 具有以下结构(即):
ID | Date | Attr1 | Attr2
1 | 2018-01-31 12:00:00 | 5 | 7
2 | 2018-01-31 12:10:00 | 4 | 3
3 | 2018-01-31 12:20:00 | 0 | 7
...
...
k | 2018-02-01 00:00:00 | 4 | 5
k+1| 2018-02-01 00:10:00 | 1 | 3
...
等等...
我正在尝试将 SUM(Attr1) 计算为 S1,将 SUM(Attr2) 计算为 S2,以及这些值之间的差值 (S1-S2)。我已经通过使用 "Self-Inner Join" 实现了它(如 here 所述)。
我还没有解决的问题是:我得到了值的全部 ( w h o l e ) SUM,我想在日期改变时重置这个 S1 和 S2。我有几个月的条目,手动完成对我来说不是一个好的选择。
你有什么建议吗?感谢您的留言和帮助。我的 SQL 级别是初中级,我不记得怎么做了。
非常感谢您的帮助。
编辑:
我的预期输出是
ID | Date | Attr1 | Attr2 | S1 | s2 | S1 -S2
1 | 2018-01-31 12:00:00 | 5 | 7 | 5 | 7 | -2
2 | 2018-01-31 12:10:00 | 4 | 3 | 9 | 10 | -1
3 | 2018-01-31 12:20:00 | 0 | 7 | 9 | 17 | -8
...
...
k | 2018-02-01 00:00:00 | 4 | 5 | 4 | 5 | -1
k+1| 2018-02-01 00:10:00 | 1 | 3 | 5 | 8 | -3
...
编辑 2:我分享了我尝试过但没有成功的内容:
select t1.id, t1.date, t1.attr1, t1.attr2,
t2.id, t2.date, t2.attr1, t2.attr2,
sum(t2.attr1) as cumAttr1,
sum(t2.attr2) as cumAttr2,
sum(t2.attr1) - sum(t2.attr2) as diffAttrs
from table t1
inner join table t2
on t1.date >= t2.date
group by t1.id, t1.attr1
order by t1.date
有了这个,我将得到整组行及其总和,但我想每天重置 "sum" 值。
再次感谢您的反馈。
编辑 2:
我已经意识到,使用存储过程可以获得相同的结果并且在我这边(facepalm)多一点点顺序。 *没有*必要尝试用一个 SELECT
完成所有事情大家好。感谢一切!
这是你想要的吗?
select date(date), sum(attr1), sum(attr2),
sum(attr1) - sum(attr2) as diff
from t
group by date(date);
我不明白 self-join 与这个问题有什么关系。
编辑:
你好像要的是累计和。对于整个问题,我会这样处理:
select t.*,
(select sum(tt1.attr1)
from t tt1
where tt1.date <= t.date
) as running_attr1,
(select sum(tt2.attr2)
from t tt2
where tt2.date <= t.date
) as running_attr2
from t;
要每天重新开始,只需在 where
子句中添加:
select t.*,
(select sum(tt1.attr1)
from t tt1
where date(tt1.date) = date(t.date) and tt1.date <= t.date
) as running_attr1,
(select sum(tt2.attr2)
from t tt2
where date(tt2.date) = date(t.date) and tt2.date <= t.date
) as running_attr2
from t;
没有看到您的原始查询,我无法确定您的查询有多接近;但这应该是获得指定结果的最简单的 self-join 查询。
SELECT t.ID, t.Date, t.Attr1, t.Attr2
, SUM(tPrev.Attr1) AS S1, SUM(tPrev.Attr2) AS S2
, SUM(tPrev.Attr1)-SUM(tPrev.Attr2) AS `S1 -S2`
FROM t AS t
LEFT JOIN t AS tPrev
ON DATE(t.Date) = DATE(tPrev.Date) -- Get records from the day of t
AND tPrev.Date <= t.Date -- But only ones earlier in the day, or t itself
GROUP BY t.ID, t.Date, t.Attr1, t.Attr2
;