Как L oop json Данные и подсчитать значения в postgres - PullRequest
1 голос
/ 30 января 2020
CREATE OR REPLACE FUNCTION file_compare()
RETURNS text LANGUAGE 'plpgsql'
COST 100 VOLATILE AS $BODY$
DECLARE

filedata text[];
fpo_data jsonb;
inddata jsonb;
f_cardholderid text;
f_call_receipt text;
i INT;

BEGIN
  SELECT json_agg((fpdata))::jsonb
  FROM (SELECT fo_data AS fpdata
        FROM fpo
        LIMIT 100
    ) t  INTO fpo_data; 
    i=0;

    FOR inddata IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP

    f_cardholderid := (inddata->>0)::JSONB->'cardholder_id'->>'value';
    f_call_receipt := (inddata->>0)::JSONB->'call_receipt_date'->>'value';

    f_primary_key := f_cardholderid || f_auth_clm_number;

    filedata[i] := jsonb_build_object(
        'fc_primary_key',f_primary_key
    );
    i := i+1;

    END LOOP;   

    RAISE NOTICE 'PRINTING DATA %', filedata;
    END;
$BODY$;

Я получаю данные файла, как показано ниже

 NOTICE:  PRINTING DATA ={"{\"fc_primary_key\": \"A1234567892017/06/27\"}","{\"fc_primary_key\": \"A1234567892017/06/27\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892024/03/01\"}","{\"fc_primary_key\": \"A12345678945353\"}","{\"fc_primary_key\": \"A1234567892023/11/22\"}","{\"fc_primary_key\": \"A12345678945252\"}","{\"fc_primary_key\": \"A1234567892017-07-01\"}"}

Теперь я хочу перебрать эти данные файла и получить каждое значение fc_primary_key и проверить количество раз, которое оно появилось во всех json данных

Примечание. Каждый ключ fc_primary_key должен проверяться только с теми значениями, которые присутствуют после него. Он не должен сравниваться с ключами fc_primary перед ним.

Например, если я проверяю третий элемент "A1234567892017 / 08/07", он появляется 4 раза после своей позиции. Таким образом, количество должно быть 4.

Где в седьмом элементе присутствует тот же «A1234567892017 / 08/07», но после седьмой позиции больше нет «A1234567892017 / 08/07». Таким образом, число должно быть ноль "0"

Как мне l oop данные и получить счет, так как я новичок в postgres Я не могу найти решение. Пожалуйста, помогите !!

1 Ответ

1 голос
/ 30 января 2020

Мне удалось получить результат, который вы описали, с помощью кода ниже. Размещая данные, вы можете воспользоваться обычным синтаксисом SQL (смещение, группировка, подсчет), суть описанной вами проблемы.

DO
$body$
   DECLARE
      fildata TEXT[] = ARRAY ['{''fc_primary_key'': ''A1234567892017/06/27''}','{''fc_primary_key'': ''A1234567892017/06/27''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892024/03/01''}','{''fc_primary_key'': ''A12345678945353''}','{''fc_primary_key'': ''A1234567892023/11/22''}','{''fc_primary_key'': ''A12345678945252''}','{''fc_primary_key'': ''A1234567892017-07-01''}'];
      count   INTEGER;
   BEGIN
      FOR i IN 1 .. array_length(fildata, 1) LOOP
         SELECT count(*) - 1
           INTO count
           FROM (
                   SELECT unnest(fildata) AS x OFFSET (i - 1)
                ) AS t
          WHERE x = fildata[i]
          GROUP BY x;

         RAISE NOTICE 'Row % appears % times after the current', fildata[i], count;
      END LOOP;
   END
$body$ LANGUAGE plpgsql;

В качестве альтернативы вы можете получить весь набор данных в одном операторе (если это будет полезно) с использованием окон вместо смещения.

SELECT t
     , count(*) OVER (PARTITION BY t ORDER BY rn RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) - 1 AS count
  FROM (
          SELECT row_number() OVER () AS rn, t
            FROM unnest(
                       ARRAY ['{''fc_primary_key'': ''A1234567892017/06/27''}','{''fc_primary_key'': ''A1234567892017/06/27''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892017/08/07''}','{''fc_primary_key'': ''A1234567892024/03/01''}','{''fc_primary_key'': ''A12345678945353''}','{''fc_primary_key'': ''A1234567892023/11/22''}','{''fc_primary_key'': ''A12345678945252''}','{''fc_primary_key'': ''A1234567892017-07-01''}']) AS t
       ) AS x
 ORDER BY rn;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...