Выполните итерацию по строкам второй таблицы, чтобы вернуть набор результатов с накопленной суммой - PullRequest
1 голос
/ 24 октября 2019

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

Посленекоторые изменения, чтобы приспособиться к моей реализации, я столкнулся с новой проблемой, которую я застрял: как сделать совокупную сумму третьего столбца? Моя проблема лучше объяснена на изображении ниже:

sql

На основе кода

SELECT
    b1.table_a_id,
    b1.label_x,
    b2.label_y
FROM table_a a
INNER JOIN table_b b1
    ON b1.table_a_id = a.table_a_id
INNER JOIN table_b b2
    ON b2.table_a_id = b1.table_a_id AND
       b2.label_y > b1.label_x
ORDER BY
    b1.table_a_id,
    b1.label_x,
    b2.label_y;

Я смог приобрестикомбинации. Каким должен быть следующий шаг, чтобы получить совокупную сумму на основе третьего столбца? Я не мог придумать решение без использования второго сервиса, такого как python с пандами, с использованием функции cumsum.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Чтобы сгенерировать ожидаемый набор результатов, вам необходимо объединить таблицу с самим собой с условием неравенства в столбце order. Затем вы можете указать сумму окна:

select 
    t1.table_a_id,
    t1.label_x,
    t2.label_y,
    sum(t2.value) over(
        partition by t1.table_a_id, t1.label_x
        order by t1."order", t2."order"
    ) agg_value
from 
table_b t1
inner join table_b t2 
    on  t1.table_a_id = t2.table_a_id
    and t2."order" >= t1."order"
order by t1."order", t2."order"

Примечание: order - зарезервированное слово, поэтому его необходимо заключить в кавычки;если у фактического столбца базы данных есть другое имя, вы можете удалить двойные кавычки.

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

TABLE_A_ID | LABEL_X | LABEL_Y | AGG_VALUE
---------: | :------ | :------ | --------:
         1 | A       | B       |         1
         1 | A       | C       |         3
         1 | A       | D       |         6
         1 | A       | E       |        10
         1 | A       | F       |        15
         1 | B       | C       |         2
         1 | B       | D       |         5
         1 | B       | E       |         9
         1 | B       | F       |        14
         1 | C       | D       |         3
         1 | C       | E       |         7
         1 | C       | F       |        12
         1 | D       | E       |         4
         1 | D       | F       |         9
         1 | E       | F       |         5
1 голос
/ 24 октября 2019

Похоже, вы хотите накопительную сумму:

SELECT b1.table_a_id, b1.label_x, b2.label_y,
       SUM(b1.value) OVER (PARTITION BY b1.table_a_id, b1.label_x
                           ORDER BY b2.order
                          ) as AGG_VALUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...