Как создать SQL на основе сложного правила?

У меня есть 3 столбца (идентификатор, дата, сумма) и пытаюсь вычислить 4-й столбец (selected_column).

Как создать SQL-запрос, чтобы сделать следующее:

Способ, который необходимо рассчитать, состоит в том, чтобы посмотреть на идентификатор (например, 1) и увидеть все те же идентификаторы за этот месяц (например, для первого вхождения - 1 сентября он должен быть рассчитан как 5, а для второго вхождения - это будет 5+6). =11 -> все суммы с начала этого месяца, включая эту сумму).

Затем в течение следующего месяца (октябрь) - он найдет первое вхождение id=1 и сохранит 3 в файле selected_column, а для второго появления id=1 в октябре будет получена сумма с начала этого месяца для того же идентификатора (3+2=5)

введите описание изображения здесь

4 ответа

Решение

Предполагая, что я правильно понял, я бы предложил соответствующий подзапрос, такой как:

select t.*, 
(
    select sum(u.amount) from table1 u  
    where 
        u.id = t.id and
        date_format(u.date, '%Y-%m') = date_format(t.date, '%Y-%m') and u.date <= t.date
) as calculated_column
from table1 t

(Изменить имя таблицы table1 в соответствии с вашими данными)

Если ваша версия поддерживает оконную функцию (например, MySQL 8 и выше)

# MySQL 8+
select 
       t.*
     , sum(amount) over (partition by id, date_format(date, '%Y-%m-01') order by date) as calculated_column
from t
;

-- Oracle
select 
       t.*
     , sum(amount) over (partition by id, trunc(date, 'MM') order by date) as calculated_column
from t
;

В Oracle и MySQL 8+ вы можете использовать оконные функции. Соответствующая дата арифметика меняется, но вот идея:

select t.*,
       (case when date = max(date) over (partition by to_char(date, 'YYYY-MM') and
                  id = 1
             then sum(amount) over (partition by to_char(date, 'YYYY-MM')
        end) as calculated_column
from t;

Внешний case просто поместить значение в соответствующую строку набора результатов. Код был бы проще, если бы все строки месяца имели одинаковое значение.

Вот решение для оракула. Поскольку вы не дали имя таблицы, я назвал ее my_table, замените ее на настоящее имя

select
    t1.id, 
    t1.date,
    t1.amount,
    decode(t1.id, 1, sum(nvl(t2.amount, 0)), null) calculated_column
from my_table1 t1
left join my_table t2 
    on trunc(t2.date, 'month') = trunc(t1.date, 'month')
    and t1.id = 1
group by t1.id, t1.date, t1.amount
Другие вопросы по тегам