Необходимо назначить другую структуру данных JSON в зависимости от значения столбца. - PullRequest
1 голос
/ 10 июня 2019
CREATE TABLE public.temp_test (
    "part_number" character varying(255),
    "service" character varying(255),
    "label" text,
    "value" double precision
);

INSERT INTO public.temp_test ("part_number", "service", "label", "value") VALUES ('ABCDSC', 'type1', '2019-05-13', 1100) ,('ABCDSC', 'type1', '2019-05-14', 1500) ,('ABCDSC', 'type1', '2019-05-15', 1300) ,('ABCDE', 'type1', '2019-05-16', 1300) ,('ABCDSC', 'type1', '2019-05-17', 1400) ,('ABCDSC', 'type1', '2019-05-18', 1400) ,('ABCDSC', 'type1', '2019-05-19', 800) ,('ABCDSC', 'type1', '2019-05-20', 1257) ,('ABCDSC', 'type1', '2019-05-21', 1100) ,('ABCDSC', 'type1', '2019-05-22', 1200) ,('ABCDSC', 'type1', '2019-05-23', 2860) ,('ABCDSC', 'type1', '2019-05-27', 1634) ,('ABCDSC', 'type1', '2019-06-06', 396) ,('QWERTY', 'type2', '2019-05-13', 200) ,('QWERTY', 'type2', '2019-05-14', 100) ,('QWERTY', 'type2', '2019-05-15', 300) ,('QWERTY', 'type2', '2019-05-16', 100) ,('QWERTY', 'type2', '2019-05-17', 100) ,('QWERTY', 'type2', '2019-05-18', 100) ,('QWERTY', 'type2', '2019-05-19', 100) ,('QWERTY', 'type2', '2019-05-20', 107) ,('QWERTY', 'type2', '2019-05-21', 200) ,('QWERTY', 'type2', '2019-05-22', 100) ,('QWERTY', 'type2', '2019-05-23', 280) ,('QWERTY', 'type2', '2019-05-27', 160) ,('QWERTY', 'type2', '2019-06-06', 3659);

Это данные, которые я получаю в temp_test

--  part_number | service |    label   |    value 
-- -------------+ ------- +------------+-------------
--  ABCDSC      |  type1  | 2019-05-13 |        1100
--  ABCDSC      |  type1  | 2019-05-14 |        1500
--  ABCDSC      |  type1  | 2019-05-15 |        1300
--  ABCDSC      |  type1  | 2019-05-16 |        1300
--  ABCDSC      |  type1  | 2019-05-17 |        1400
--  ABCDSC      |  type1  | 2019-05-18 |        1400
--  ABCDSC      |  type1  | 2019-05-19 |         800
--  ABCDSC      |  type1  | 2019-05-20 |        1257
--  ABCDSC      |  type1  | 2019-05-21 |        1100
--  ABCDSC      |  type1  | 2019-05-22 |        1200
--  ABCDSC      |  type1  | 2019-05-23 |        2860
--  ABCDSC      |  type1  | 2019-05-27 |        1634
--  ABCDSC      |  type1  | 2019-06-06 |         396
--  QWERTY      |  type2  | 2019-05-13 |         200
--  QWERTY      |  type2  | 2019-05-14 |         100
--  QWERTY      |  type2  | 2019-05-15 |         300
--  QWERTY      |  type2  | 2019-05-16 |         100
--  QWERTY      |  type2  | 2019-05-17 |         100
--  QWERTY      |  type2  | 2019-05-18 |         100
--  QWERTY      |  type2  | 2019-05-19 |         100
--  QWERTY      |  type2  | 2019-05-20 |         107
--  QWERTY      |  type2  | 2019-05-21 |         200
--  QWERTY      |  type2  | 2019-05-22 |         100
--  QWERTY      |  type2  | 2019-05-23 |         280
--  QWERTY      |  type2  | 2019-05-27 |         160
--  QWERTY      |  type2  | 2019-06-06 |        3659

Но в функции PSQL мне нужно назначить это двум клавишам DailyPart1Usage & DailyPart2Usage


CREATE TYPE DATA AS(
    "DailyPart1Usage"            JSONB,
    "DailyPart2Usage"            JSONB
);

DROP FUNCTION IF EXISTS "GetData"(INTEGER,BIGINT,TEXT,JSON,TEXT,TEXT,TEXT);
CREATE OR REPLACE FUNCTION "GetData"()
RETURNS DATA AS $$
DECLARE

    daily_part_data  JSON;
    -- May be need 1 more data type here to distinguish between DailyPart1Usage, DailyPart2Usage.

BEGIN

    SELECT 
        array_to_json(array_agg(row_to_json(sq1))) INTO daily_part_data
    FROM (
        SELECT
            "value",
            "label"
        FROM
        temp_test
    ) AS sq1;

    RETURN account_dash_data;
END;
$$ LANGUAGE plpgsql;

Прямо сейчас только daily_part_data содержит все данные типа детали

[{"label":"2019-05-13","value":1100},{"label":"2019-05-14","value":1500},{"label":"2019-05-15","value":1300},{"label":"2019-05-16","value":1300},{"label":"2019-05-17","value":1400},{"label":"2019-05-18","value":1400},{"label":"2019-05-19","value":800},{"label":"2019-05-20","value":1257},{"label":"2019-05-21","value":1100},{"label":"2019-05-22","value":1200},{"label":"2019-05-23","value":2860},{"label":"2019-05-27","value":1634},{"label":"2019-06-06","value":396}]

Мне нужна эта структура данных ниже:

Я пытался построить данные JSON сСЛУЧАЙ, но невозможно вставить в DATA.

-- Expected Result in `DailyPart1Usage`, `DailyPart2Usage`
"DailyPart1Usage": {    --- Relatod to Part1: ABCDSC
    "ChartData": [
        {
            "value": 10,
            "label": "2019-05-07"
        },
        {
            "value": 20,
            "label": "2019-05-06"
        }
        ....
    ]
},
"DailyPart2Usage": {    --- Relatod to Part2: QWERTY
    "ChartData": [
        {
            "value": 100,
            "label": "2019-05-07"
        },
        {
            "value": 129,
            "label": "2019-05-06"
        }
        ....
    ]
}

Примечание: там будет только 2 типа детали.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Посмотрите на результаты этого запроса и посмотрите, приблизится ли он к вам.

Он создает строки JSON для каждого part_number, которые выглядят так:

{"ChartData" : [{"label" : "2019-05-16", "value" : 1300}, ...]}

Вы можете расширить его, включив в него ключ типа DailyPart2Usage, но неясно, как вы намеревались отнести это обратно к part_number.

SELECT
  json_build_object(
    'ChartData',
    array_to_json(
      array_agg(
        json_build_object(
          'label', label,
          'value', value
        )
      )
    )
  )
FROM
  temp_test
GROUP BY
  part_number
0 голосов
/ 12 июня 2019

Благодаря @ mike.k, используя его ответ, я смог получить необходимые данные, используя следующий запрос:

    SELECT 
        jsonb_object_agg(sq."service", "Data") INTO daily_usage_data
    FROM (
        SELECT
            temp_test."service",
            json_build_object(
                'ChartData',
                    array_to_json(
                    array_agg(
                            json_build_object(
                                'label', "label",
                                'value', "value"
                            )
                    )
                )
            )
            "Data"
        FROM temp_test
        GROUP BY temp_test."service"
    ) AS sq1;

    -- Assign Query data to DATA Keys.
    DATA."DailyPart1Usage"                       = daily_usage_data->>'type1';
    DATA."DailyPart2Usage"                       = daily_usage_data->>'type2';
...