Untitled

 avatar
unknown
plain_text
9 days ago
8.8 kB
7
Indexable
WITH relevant_threshold_investment_allowance_deltas AS (
         SELECT DISTINCT
            iadva.id AS iadva_id,
            r.revtstmp AS revtstmp,
            iadva.revtype AS revtype,
            iadva.rev,
            iadva.management_delta AS delta,
            iadva.management_max_discount AS maxOrSpecialPrice,
            iadva.is_management_delta_locked AS deltaLocked,
            iadva.from_value AS fromValue,
            iadva.threshold_type AS thresholdType,
            iadva.group_investment_allowance_deltas_id AS giada_id,
            LAG(iadva.management_delta) OVER (PARTITION BY iadva.id ORDER BY r.rev) AS deltaBefore,
            LAG(iadva.management_max_discount) OVER (PARTITION BY iadva.id ORDER BY r.rev) AS maxOrSpecialPriceBefore,
            LAG(iadva.is_management_delta_locked) OVER (PARTITION BY iadva.id ORDER BY r.rev) AS deltaLockedBefore,
            LAG(iadva.from_value) OVER (PARTITION BY iadva.id ORDER BY r.rev) AS fromValueBefore,
            LAG(iadva.threshold_type) OVER (PARTITION BY iadva.id ORDER BY r.rev) AS thresholdTypeBefore
         FROM investment_allowance_delta_values_aud iadva
                  JOIN revinfo r ON iadva.rev = r.rev
     ),
     investment_allowance_history AS (
         -- Management Delta History
         SELECT DISTINCT
             iadva.id AS iadva_id,
             r.revtstmp AS timestamp,
--              giada.modification_date AS modificationDate,
--              giada.modified_by AS modifiedBy,
             giada.date_from AS dateFrom,
             giada.date_to AS dateTo,
             'MANAGEMENT' AS roleType,
             ps.name AS segmentName,
             gda.group_discount_type AS discountType,
             giada.rev AS giada_rev,
             iadva.rev AS iadva_rev,
             CASE
                 WHEN giada.group_investment_allowance_deltas_bundle_id IS NOT NULL THEN 'TIME_CONDITIONS'
                 ELSE 'BASIC_CONDITIONS'
                 END AS conditionType,
             COALESCE((
                          SELECT
                              COUNT(*) -
                              COALESCE((
                                           SELECT COUNT(*)
                                           FROM relevant_threshold_investment_allowance_deltas t
                                           WHERE t.giada_id = giada.id
                                             AND t.rev <= giada.rev
                                             AND t.revtype = 2
                                       ), 0)
                          FROM relevant_threshold_investment_allowance_deltas t
                          WHERE t.giada_id = giada.id
                            AND t.rev <= giada.rev
                            AND t.revtype IN (0)
                      ), 0) AS thresholdCount,
             CASE
                 WHEN giada.id IS NULL THEN LAG(iadva.group_investment_allowance_deltas_id) OVER (PARTITION BY iadva.id ORDER BY r.rev)
                 ELSE giada.id
                 END AS giada_id,
             CASE
                 WHEN giada.modified_by IS NULL
                     THEN LAG(giada.modified_by) OVER (PARTITION BY iadva.id ORDER BY r.rev)
                 ELSE giada.modified_by
                 END AS modifiedBy,
             CASE
                 WHEN giada.modification_date IS NULL
                     THEN LAG(giada.modification_date) OVER (PARTITION BY iadva.id ORDER BY r.rev)
                 ELSE giada.modification_date
                 END AS modificationDate

         FROM investment_allowance_delta_values_aud iadva
                  JOIN revinfo r ON iadva.rev = r.rev
                  LEFT JOIN group_investment_allowance_deltas_aud giada
                       ON giada.id = iadva.group_investment_allowance_deltas_id
                  LEFT JOIN group_investment_allowance_deltas_bundles_aud giadba
                  ON giada.id = giadba.group_investment_allowance_deltas_id   --> basic
                    OR giadba.id = giada.group_investment_allowance_deltas_bundle_id   --> timely
                  LEFT JOIN price_segments ps
                    ON ps.id = giadba.price_segment_id
                  LEFT JOIN group_deltas_bundles gdb
                    ON giadba.group_deltas_bundle_id = gdb.id
                  LEFT JOIN groups g
                    ON gdb.id = g.group_deltas_bundle_id
                  LEFT JOIN group_discounts_aud gda
                    ON gda.id = g.discount_id
         WHERE giada.rev = iadva.rev
            OR giada.rev IS NULL  --> to include delete records
            OR (giada.rev != iadva.rev
                    AND giada.date_from != giada.date_to
                    AND iadva.rev = (SELECT MAX(iadva2.rev)
                              FROM investment_allowance_delta_values_aud iadva2
                              WHERE iadva2.group_investment_allowance_deltas_id = iadva.group_investment_allowance_deltas_id)
                )
     ),

     investment_allowance_history_final AS (
     SELECT
       iah.timestamp,
       iah.roleType,
       iah.segmentName,
       iah.conditionType,
       iah.discountType,
       iah.modifiedBy,
       iah.modificationDate,
       iah.dateFrom,
       iah.dateTo,
       iah.giada_rev,
       iah.iadva_rev,
       iah.giada_id,
       iah.thresholdCount,
       ARRAY_AGG(iah.iadva_id) AS iadva_id_list,
       LAG(COALESCE((
                        SELECT
                            COUNT(*) -
                            COALESCE((
                                         SELECT COUNT(*)
                                         FROM relevant_threshold_investment_allowance_deltas t
                                         WHERE t.giada_id = iah.giada_id
                                           AND t.rev <= iah.giada_rev
                                           AND t.revtype = 2
                                     ), 0)
                        FROM relevant_threshold_investment_allowance_deltas t
                        WHERE t.giada_id = iah.giada_id
                          AND t.rev <= iah.giada_rev
                          AND t.revtype IN (0)
                    ), 0)) OVER (PARTITION BY iah.giada_id ORDER BY iah.timestamp) AS thresholdCountBefore
       ,
       COALESCE((
                          SELECT JSON_AGG(
                                         JSON_BUILD_OBJECT(
                                                 'delta', t.delta,
                                                 'maxOrSpecialPrice', t.maxOrSpecialPrice,
                                                 'deltaLocked', t.deltaLocked,
                                                 'fromValue', t.fromValue,
                                                 'thresholdType', t.thresholdType,
                                                 'deltaBefore', t.deltaBefore,
                                                 'maxOrSpecialPriceBefore', t.maxOrSpecialPriceBefore,
                                                 'deltaLockedBefore', t.deltaLockedBefore,
                                                 'fromValueBefore', t.fromValueBefore,
                                                 'thresholdTypeBefore', t.thresholdTypeBefore
                                         )
                                 )
                          FROM relevant_threshold_investment_allowance_deltas t
                          WHERE t.giada_id = iah.giada_id
                            --> mozliwe ze jeszcze roleType match
                          AND t.rev = iah.giada_rev
                      ), '[]') AS threshold_details
       FROM investment_allowance_history iah
        GROUP BY iah.roleType, iah.segmentName,
                 iah.conditionType,
                 iah.discountType,
                 iah.modifiedBy,
                 iah.modificationDate,
                 iah.dateFrom,
                 iah.dateTo,iah.timestamp, iah.conditionType, iah.giada_rev, iah.iadva_rev, iah.giada_id, iah.thresholdCount)

SELECT * FROM investment_allowance_history_final iahf
WHERE
  roleType IN (:roleTypes)
--   Optional filter on modifiedBy (works only if we have at least one value in the list)
  AND (:modifiedBy::TEXT[] IS NULL OR modifiedBy = ANY(:modifiedBy::TEXT[]))
--   Optional filter on modificationDate (works only if start and end dates are provided)
  AND (modificationDate BETWEEN :startDate AND :endDate)
  AND (
    :deltaChange::BOOLEAN IS NULL OR :deltaChange = FALSE
        OR EXISTS (
        SELECT 1
        FROM jsonb_array_elements(threshold_details::jsonb) elem
        WHERE (elem->>'delta')::NUMERIC IS DISTINCT FROM (elem->>'deltaBefore')::NUMERIC
--         WHERE (elem->>'maxOrSpecialPrice')::NUMERIC IS DISTINCT FROM (elem->>'maxOrSpecialPriceBefore')::NUMERIC
    )
    )
ORDER BY timestamp DESC
LIMIT :limit OFFSET :offset;
Editor is loading...
Leave a Comment