Как создать 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