Как создать SQL на основе сложного правила? - PullRequest
0 голосов
/ 29 ноября 2018

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

Как создать запрос SQL, выполнив следующее:

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

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

enter image description here

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Если ваша версия поддерживает оконную функцию (например, 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
;
0 голосов
/ 29 ноября 2018

В 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 просто помещает значение в соответствующую строку набора результатов.Код был бы проще, если бы все строки месяца имели одинаковое значение.

0 голосов
/ 29 ноября 2018

Вот решение для оракула.Поскольку вы не дали имя таблицы, я назвал ее 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
0 голосов
/ 29 ноября 2018

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

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 в соответствии с вашими данными)

...