WITH q (id, user_id, user_date, emotion, emotion_level) AS
(
VALUES
(1, 1, '2011-07-13'::DATE, 'Anger', 3),
(2, 1, '2011-07-13'::DATE, 'Anger', 5),
(3, 1, '2011-07-13'::DATE, 'Sadness', 2),
(4, 1, '2011-07-13'::DATE, 'Interest', 2),
(5, 2, '2011-07-13'::DATE, 'Anger', 1),
(6, 2, '2011-07-13'::DATE, 'Sadness', 4),
(7, 2, '2011-07-13'::DATE, 'Sadness', 5),
(8, 2, '2011-07-13'::DATE, 'Interest', 3),
(9, 3, '2011-07-13'::DATE, 'Anger', 1),
(10, 3, '2011-07-13'::DATE, 'Sadness', 3),
(11, 3, '2011-07-13'::DATE, 'Interest', 4),
(12, 3, '2011-07-13'::DATE, 'Interest', 5)
)
SELECT user_id, user_date,
AVG(CASE emotion WHEN 'Anger' THEN emotion_level END)::numeric(3, 2) AS Anger,
AVG(CASE emotion WHEN 'Sadness' THEN emotion_level END)::numeric(3, 2) AS Sadness,
AVG(CASE emotion WHEN 'Interest' THEN emotion_level END)::numeric(3, 2) AS Interest
FROM q
GROUP BY
user_id, user_date
ORDER BY
user_id, user_date
Проблема заключалась в том, что первоначально использованные выражения:
AVG(case emotion when 'Interest' then convert(float, emotion_level) else 0 end)
усреднялись по всем записям для данного пользователя на данную дату и рассматривали не Interest
записи как 0
, тогда какк ним следует относиться как NULL
, чтобы они не влияли на Interest
среднее значение.