Установка номера партии для набора записей в sql - PullRequest
1 голос
/ 14 апреля 2020

У меня есть следующая таблица в SQL

id,date,records
1,2019-03-28 01:22:12,5
2,2019-03-29 01:23:23,5
3,2019-03-30 01:28:54,5
4,2019-03-28 01:12:21,2
5,2019-03-12 01:08:11,1
6,2019-03-28 01:01:21,12
7,2019-03-12 01:02:11,1

То, что я пытаюсь достичь, это установить номер партии, который должен увеличиваться после того, как значение скользящей суммы пересекает 15, а также должна сбрасываться скользящая сумма. , поэтому я пытаюсь создать пакет для записей, которые имеют значение общей скользящей суммы как 15

Например. если Moving sum становится 15, значение номера партии должно увеличиваться, что дало бы мне строки, содержащие общее значение 15.

, поэтому вывод, который я ищу, равен

id,date,records, moving_sum,batch_number
1,2019-03-28 01:22:12,5,5,1
2,2019-03-29 01:23:23,5,10,1
3,2019-03-30 01:28:54,5,15,1
4,2019-03-28 01:12:21,2,2,2
5,2019-03-12 01:08:11,1,1,2
6,2019-03-28 01:01:21,2,12,2
7,2019-03-12 01:02:11,1,1,3

1 Ответ

1 голос
/ 14 апреля 2020

Для этого вам нужен рекурсивный запрос:

with 
    tab as (select t.*, row_number() over(order by id) rn from mytable t),
    cte as (
        select 
            id, 
            date, 
            records, 
            records moving_sum, 
            1 batch_number,
            rn
        from tab
        where rn = 1
        union all
        select
            t.id,
            t.date,
            t.records,
            case when c.moving_sum + t.records > 15 then t.records else c.moving_sum + t.records end,
            case when c.moving_sum + t.records > 15 then c.batch_number + 1 else c.batch_number end,
            t.rn
        from cte c
        inner join tab t on t.rn = c.rn + 1
    )
select id, date, records, moving_sum, batch_number from cte order by id

Синтаксис выражений рекурсивных общих таблиц немного различается в разных базах данных, поэтому вам может потребоваться адаптировать этот немного в зависимости от вашего база данных.

Также обратите внимание, что если id s начинается с 1 и всегда увеличиваются без пробелов, вы фактически не используете общее табличное выражение tab, и вы можете заменить rn на id во втором общем табличном выражении.

Демонстрация по DB Fiddle :

id | date       | records | moving_sum | batch_number
-: | :--------- | ------: | ---------: | -----------:
 1 | 2019-03-28 |       5 |          5 |            1
 2 | 2019-03-29 |       5 |         10 |            1
 3 | 2019-03-30 |       5 |         15 |            1
 4 | 2019-03-28 |       2 |          2 |            2
 5 | 2019-03-12 |       1 |          3 |            2
 6 | 2019-03-28 |      12 |         15 |            2
 7 | 2019-03-12 |       1 |          1 |            3
...