SQL - рассчитать сумму depth_progress за предыдущие 24 часа для каждой записи?

SQL — вычислить сумму md_delta за предыдущие 24 часа для каждой записи.

Вот пример того, что я снимаю

SQL - рассчитать сумму depth_progress за предыдущие 24 часа для каждой записи?

По сути, я пытаюсь создать запрос, который возвращает базовую таблицу без изменений, так что для каждой строки в левой таблице он возвращает сумму MD_DELTA за предыдущие 24 часа для каждого уникального идентификатора.

Я думаю, что мне, вероятно, понадобится использовать коррелированный подзапрос, но, похоже, он работает неправильно.

Вот пример кода:

SELECT
 PG."INFO_ID" AS ID
,PG."RANK"
,PG."TIMEPOINT" 
,PG."MD_DELTA"
,G."TOTAL_24HR_DELTA"
FROM CTE_PGROUPS AS PG
    LEFT JOIN( 
    /*
       CORRELATED SUB-QUERY TO GET THE SUM OF THE DEPTH_PROGRESS FROM THEPREVIOUS 
       24-HOUR TIME PERIOD FOR EACH
    */
    SELECT 
      G."TIMEPOINT"
      ,SUM(G."MD_DELTA") AS TOTAL_24HR_DELTA
    FROM CTE_PGROUPS AS G
    WHERE G."TIMEPOINT" >= DATEADD('DAY',-1, G."TIMEPOINT")
    GROUP BY G."TIMEPOINT"
   ) AS G ON PG."TIMEPOINT" = G."TIMEPOINT"
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование этого CTE для данных:

WITH data AS (
    SELECT 
    *
    FROM VALUES
        (306, '2022-03-21 01:00:00'::timestamp, 0.5),  
        (306, '2022-03-21 08:00:00'::timestamp, 0.5),  
        (306, '2022-03-21 16:00:00'::timestamp, 0.5),  
        (306, '2022-03-21 21:00:00'::timestamp, 0.5),  
        (306, '2022-03-22 02:00:00'::timestamp, 0.5),  
        (306, '2022-03-22 06:00:00'::timestamp, 0.5),  
        (306, '2022-03-22 12:00:00'::timestamp, 0.5),  
        (306, '2022-03-22 18:00:00'::timestamp, 0.5),  
        (306, '2022-03-22 22:00:00'::timestamp, 0.5)
        v(id, timepoint, depth_progress)
)

этот SQL дает:

SELECT d.id, 
    d.timepoint, 
    sum(d2.depth_progress)
FROM data AS d
JOIN data AS d2 
    ON d.id = d2.id 
        AND d2.timepoint between dateadd(day,-1,d.timepoint) and d.timepoint
GROUP BY 1,2
ORDER BY 1,2;

дает:

Я БЫМОМЕНТ ВРЕМЕНИСУММ(D2.DEPTH_PROGRESS)
3062022-03-21 01:00:00.0000,5
3062022-03-21 08:00:00.0001
3062022-03-21 16:00:00.0001,5
3062022-03-21 21:00:00.0002
3062022-03-22 02:00:00.0002
3062022-03-22 06:00:00.0002,5
3062022-03-22 12:00:00.0002,5
3062022-03-22 18:00:00.0002,5
3062022-03-22 22:00:00.0002,5

и если бы ваша таблица была "официальной", я бы предварительно обусловил эти данные, например:

WITH massive_pre_condition as (
    select *,
        dateadd(day,-1,timepoint) as minus_one_day,
        timepoint::date as d1,
        minus_one_day::date as d2
    FROM data
)
SELECT d.id, 
    d.timepoint, 
    sum(d2.depth_progress)
FROM massive_pre_condition AS d
JOIN massive_pre_condition AS d2 
    ON d.id = d2.id 
        AND d2.d1 IN (d.d1, d.d2)
        AND d2.timepoint between d.minus_one_day and d.timepoint
GROUP BY 1,2
ORDER BY 1,2;

СПАСИБО, ЭТО ИМЕННО ТО, ЧТО Я ИСКАЛА!

Tyler Hunt 21.03.2022 22:06

Другие вопросы по теме