Skip to content

BIN_AND_AGG, BIN_OR_AGG, and BIN_XOR_AGG (BIN_AND, BIN_OR and BIN_XOR as aggregate functions) #8175

@livius2

Description

@livius2

Hi

as #8173 is closed as not planned, please add BIN_OR and BIN_AND as aggregate functions (can be under different name if you see some conflicts).

Currently we must do this in stored procedures or execute block in the loop.
This will simplify things a lot.

example what we must do currently instead of simple grouping function:

EXECUTE BLOCK RETURNS(
  RODZ_REP_ID TYPE OF COLUMN RODZAJ_REPARTYCJI.RODZ_REP_ID
, RODZ_REP_NAZWA TYPE OF COLUMN RODZAJ_REPARTYCJI.RODZ_REP_NAZWA
, RODZ_REP_TEXT TYPE OF COLUMN RODZAJ_REPARTYCJI.RODZ_REP_TEXT 
, MASKA_OBSZAR_ID TYPE OF COLUMN RODZAJ_UMOWY.MASKA_OBSZAR_ID
, MASKA_STR VARCHAR(16)
)
AS
DECLARE VARIABLE TMP_MASKA_OBSZAR_ID TYPE OF COLUMN RODZAJ_UMOWY.MASKA_OBSZAR_ID;
DECLARE VARIABLE NEXT_RODZ_REP_ID TYPE OF COLUMN RODZAJ_REPARTYCJI.RODZ_REP_ID;
BEGIN
    NEXT_RODZ_REP_ID = '';
    MASKA_OBSZAR_ID = 0;
    FOR
        SELECT
            DISTINCT 
              RR.RODZ_REP_ID
            , RR.RODZ_REP_NAZWA
            , RR.RODZ_REP_TEXT
            , RU.MASKA_OBSZAR_ID
            /* , LICZ_BIT_TO_STR(RU.MASKA_OBSZAR_ID, 16) AS MASKA_STR */
            , LEAD(RR.RODZ_REP_ID, 1) over (order by RR.RODZ_REP_TEXT, RR.RODZ_REP_ID, RD.RDB$DB_KEY) AS NEXT_RODZ_REP_ID
        FROM
            RODZAJ_REPARTYCJI RR
            INNER JOIN RODZAJ_DZIAL RD ON RR.RODZ_REP_ID = RD.RODZ_REP_ID
            INNER JOIN RODZAJ_UMOWY RU ON RU.RODZ_UMOWY_ID = RD.RODZ_UMOWY_ID AND RU.TYP_UMOWY_ID = RD.TYP_UMOWY_ID
        WHERE
            RR.RODZ_REP_ID <> ''
        ORDER BY
            RR.RODZ_REP_TEXT, RR.RODZ_REP_ID, RD.RDB$DB_KEY
    INTO :RODZ_REP_ID, :RODZ_REP_NAZWA, :RODZ_REP_TEXT, :TMP_MASKA_OBSZAR_ID, :NEXT_RODZ_REP_ID
    DO
      BEGIN
         MASKA_OBSZAR_ID = BIN_OR(:MASKA_OBSZAR_ID, :TMP_MASKA_OBSZAR_ID);  
         IF (:RODZ_REP_ID IS DISTINCT FROM :NEXT_RODZ_REP_ID) THEN
           BEGIN
             MASKA_STR = LICZ_BIT_TO_STR(MASKA_OBSZAR_ID, 16);
             SUSPEND;
             TMP_MASKA_OBSZAR_ID = 0;
             MASKA_OBSZAR_ID = 0;
           END          
      END
END

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions