Сумма значений за неделю до определенного дня недели SQL

#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;
 

Ссылка: СУММА