如何在标志列指示的事件的前一天,后一天和后一天汇总一列?

时间:2019-07-02 19:34:22

标签: mysql

我有一张桌子,其中有一个日期列,在另一列中有一些幸福的自我报告,还有一个标志列,它指示健身房的日子。

我想在体育课的前一天,后一天和后一天获得平均幸福分数。

如果您想像这张表,则平均值应返回day_before = 1,day_of = 2和day_after =3。

enter image description here

所以设置类似于this fiddle,尽管在我的实际数据库中,健身房标志列是从单独的表中加入的。

CREATE TABLE test
    (`date` datetime, `gym` int, `happiness` int)
;

INSERT INTO test
    (`date`, `gym`, `happiness`)
VALUES
    ('2019-01-06 00:00:00', NULL, 1),
    ('2019-02-06 00:00:00', 1, 2),
    ('2019-03-06 00:00:00', NULL, 3),
    ('2019-04-06 01:00:00', NULL, 1),
    ('2019-05-06 01:00:00', 1, 2),
    ('2019-06-06 01:00:00', NULL, 3),
    ('2019-07-06 01:00:00', NULL, 1),
    ('2019-08-06 01:00:00', 1, 2),
    ('2019-09-06 01:00:00', NULL, 3)
;

我尝试使用子查询返回date-1 = 1中的“ gym”列的时间,并在具有“ day of”,“ day before”和“ day after”字符串的情况下使用结果。然后,我可以简单地按该列分组。我无法使它正常工作,我甚至不确定是否可以做到这一点。

1 个答案:

答案 0 :(得分:1)

使用两个自联接。

SELECT AVG(before.happiness) AS day_before, AVG(current.happiness) AS day_of, AVG(after.happiness) AS day_after
FROM test AS current
JOIN test AS before ON before.date = DATE_SUB(current.date, INTERVAL 1 DAY)
JOIN test AS after ON after.date  = DATE_ADD(current.date, INTERVAL 1 DAY)
WHERE current.gym = 1