【问题标题】:How to Loop json Data and count the values in postgres如何循环json数据并计算postgres中的值
【发布时间】:2020-01-30 13:04:45
【问题描述】:
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”

如何循环数据并获取计数,因为我是 postgres 的新手,我无法找到解决方案。请帮忙!!

【问题讨论】:

    标签: postgresql stored-procedures plpgsql postgresql-9.5 stored-functions


    【解决方案1】:

    我能够得到你用下面的代码描述的结果。通过取消嵌套数据,您可以利用常规 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;
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2020-02-07
      • 2017-09-12
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多