我有一张桌子,其中有一个日期列,在另一列中有一些幸福的自我报告,还有一个标志列,它指示健身房的日子。
我想在体育课的前一天,后一天和后一天获得平均幸福分数。
如果您想像这张表,则平均值应返回day_before = 1,day_of = 2和day_after =3。
所以设置类似于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”字符串的情况下使用结果。然后,我可以简单地按该列分组。我无法使它正常工作,我甚至不确定是否可以做到这一点。
答案 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