Здравствуйте. Подскажите пожалуйста. Есть запрос который должен через оконную функцию посчитать баланс, а далее все это упаковать в jsonb.
Как бы удалось сделать через CTE
1) сначала в запросе делаем нужные данные с ипользованием оконной функции
2) делаем запрос уже на формирование jsonb
WITH "DevicesStatistics" as (
SELECT
"Devices".id,
"Cartridges".id as "cartridgeId",
"Cartridges"."quantityResource" as "quantityResource",
"Statistics"."quantityPrinted" as "quantityPrinted",
"Cartridges"."quantityResource" - SUM("Statistics"."quantityPrinted")
OVER (PARTITION by "Cartridges".id ORDER BY "Statistics"."lastActive") as "quantityBalance",
"Statistics"."lastActive" as "lastActive"
FROM "Devices"
LEFT JOIN "Statistics" ON "Devices".id = "Statistics"."deviceId"
LEFT JOIN "Cartridges" ON "Statistics"."cartridgeId" = "Cartridges"."id"
ORDER BY "Devices".code
)
select
id,
COALESCE(SUM("quantityPrinted"), 0) AS "quantityPrinted",
COALESCE(JSONB_AGG(
JSON_BUILD_OBJECT(
'id', "cartridgeId",
'quantityResource', "quantityResource",
'quantityPrinted', "quantityPrinted",
'quantityBalance', "quantityBalance",
'lastActive', "lastActive"
) ORDER BY "lastActive" DESC
) FILTER (WHERE "cartridgeId" IS NOT NULL), '[]') AS cartridges
from "DevicesStatistics"
group by id
но кострукция вышла мегабольшая, можно ли как-то это в один запрос впихнуть? Спасибо
П.С. Пробовал вот так, но тогда оконная функция неправильно работает, она не считает предидущие значения
SELECT
JSONB_AGG(
(select x from (select
"Cartridges".id,
"Cartridges"."quantityResource",
"Statistics"."quantityPrinted",
"Cartridges"."quantityResource" - SUM("Statistics"."quantityPrinted")
OVER (PARTITION by "Cartridges".id ORDER BY "Statistics"."lastActive") as balance
) as x) order by "Statistics"."lastActive" DESC
) AS cartridges
FROM "Devices"
LEFT JOIN "Statistics" ON "Devices".id = "Statistics"."deviceId"
LEFT JOIN "Cartridges" ON "Statistics"."cartridgeId" = "Cartridges"."id"
WHERE "Devices".code = '10037' ;