bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Оконные функции и агрегация?

Здравствуйте. Подскажите пожалуйста. Есть запрос который должен через оконную функцию посчитать баланс, а далее все это упаковать в 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' ;
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы