#sql #join #left-join #snowflake-cloud-data-platform
Вопрос:
В моем случае для терапии в течение недели назначено определенное время. Установленное время для недели составляет, например, 5 часов. И, например, на этой конкретной неделе было 3 занятия по 2 часа, всего 6. Затем я должен отметить первые действия как «в течение установленного времени», а последнее — «в течение установленного времени». Но как мне вычислить сумму часов до этого последнего действия этой недели, потому что я должен сравнить это значение с предписанными часами.
Мои данные выглядят следующим образом:
activity_id | Дата | годовая неделя | время | предписанное_time_for_week |
---|---|---|---|---|
1 | 2021-01-01 | 2021-01 | 2 часа | 5 часов |
2 | 2021-01-02 | 2021-01 | 2 часа | 5 часов |
3 | 2021-01-03 | 2021-01 | 2 часа | 5 часов |
И это должно быть результатом:
activity_id | Дата | годовая неделя | время | предписанное_time_for_week | Within_prescribed_time |
---|---|---|---|---|---|
1 | 2021-01-01 | 2021-01 | 2 часа | 5 часов | ДА |
2 | 2021-01-02 | 2021-01 | 2 часа | 5 часов | ДА |
3 | 2021-01-03 | 2021-01 | 2 часа | 5 часов | НЕТ |
Это запрос, который я пробовал, но я получаю следующую ошибку:
Ошибка компиляции SQL: ошибка строки 49 в позиции 28 недопустимый идентификатор ‘A.DATUM’
Из-за того, ЧТО a.datum <= a2.datum
Select a.activity_id
, a.date
, a.yearweek
, a.time
, a.prescribed_time_for_week
, IFF(a.prescribed_time_for_week > week.total_time, 'yes', 'no') as Within_prescribed_time
from activities as a
LEFT JOIN (SELECT a2.activity_id
, a2.yearweek
, SUM(a2.time) as total_time
FROM activities as a2
WHERE a.date <= a2.date
GROUP BY a2.activity_id, a2.yearweek) as week
ON week.activity_id = pt.activity_id
AND week.yearweek = a.yearweek
Я надеюсь, что кто-то знает, как это сделать.
Комментарии:
1. Привет, из сообщения похоже, что оно не может найти данные столбца, пожалуйста, проверьте, присутствует ли этот столбец в таблице activities, проверьте, был ли он определен как верхний регистр. Если возможно, пожалуйста, пришлите нам структуру таблицы.
Ответ №1:
В этом случае достаточно использовать текущую СУММУ, мое предложение ниже.
Пример данных:
CREATE OR REPLACE TABLE T1 (
activity_id INT,
date DATE,
yearweek STRING,
time INT,
prescribed_time_for_week INT
);
INSERT INTO T1(activity_id, date, yearweek, time, prescribed_time_for_week)
SELECT *
FROM VALUES
(1, '2021-01-01', '2021-01', 2, 5),
(2, '2021-01-02', '2021-01', 2, 5),
(3, '2021-01-03', '2021-01', 2, 5) t(activity_id, date, yearweek, time, prescribed_time_for_week);
Решение:
SELECT a.activity_id, a.date, a.yearweek, a.time, a.prescribed_time_for_week
, SUM(a.time) OVER(PARTITION BY a.yearweek ORDER BY a.date) AS runing_sum
, IFF(a.prescribed_time_for_week - SUM(a.time) OVER(PARTITION BY a.yearweek ORDER BY a.date) > 0, 'yes', 'no') AS within_prescribed_time
FROM T1 AS a;
Ссылка: СУММА