我怎样才能重置" MySQL嵌套的Select Query

时间:2018-04-10 14:39:50

标签: mysql sql nested-queries

我一直在设法解决这个MySQL-Riddle,我认为现在还不清楚。

我有一个具有以下结构的表格(即):

    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 e 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

有了这个,我将获得整个行的总和,但我想重置"总和"每天都有价值。

再次感谢您的反馈。

编辑2:

我已经意识到,可以通过存储过程获得相同的结果,并且可以获得更多的顺序(facepalm)。使用单个SELECT

尝试完成所有事情并非*必要

最好的问候,大家好。谢谢你的一切!

2 个答案:

答案 0 :(得分:0)

这是你想要的吗?

select date(date), sum(attr1), sum(attr2),
       sum(attr1) - sum(attr2) as diff
from t
group by date(date);

我不知道自我加入与此问题有什么关系。

编辑:

您似乎想要累计金额。我会针对整个问题来解决这个问题:

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;

答案 1 :(得分:0)

在没有看到原始查询的情况下,我无法确定你的距离有多近;但这应该是最简单的自连接查询,以获得您指定的结果。

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
;