Как запросить дублированные строки по значению столбца? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь выяснить, как продублировать мои строки на основе столбцов pass и fail. Ниже приведена таблица, к которой я до сих пор обращался.

enter image description here

Код запроса показан ниже. Я запрашиваю у json.

SELECT
    to_date(LotSummary ->> 'Start', 'HH24:MI:SS DD/MM/YY')AS "Date",
    Machine AS "Machine",
    LotSummary ->> 'Pass' AS "Pass",
    LotSummary ->> 'Fail' AS "Fail"
FROM
(
    SELECT
        CASE
            WHEN jsonb_typeof(json_data->'OEESummary'->'LotSummary'->'Lot') = 'array'
            THEN
                jsonb_array_elements(cast(json_data->'OEESummary'->'LotSummary'->'Lot' AS JSONB))
            ELSE
                json_data->'OEESummary'->'LotSummary'->'Lot'
            END
        AS LotSummary,
        json_data->'OEESummary'->>'MachineID' AS Machine
    FROM
    (
        SELECT
        jsonb_array_elements(cast(json_data->>'body' AS JSONB)) AS json_data
      FROM data
    )t
    WHERE
       json_data ->> 'file_name' = 'OEE.xml'
)a
WHERE
    to_date(LotSummary ->> 'Start', 'HH24:MI:SS DD/MM/YY') IS NOT NULL

Итак, допустим, я хочу запросить его как дубликаты для разделения значений Pass и Fail , например:

+----------------------------+--------------+------+------+
|            Date            |   Machine    | Pass | Fail |
+----------------------------+--------------+------+------+
| "2019-08-04T16:00:00.000Z" | TRS1000i-082 | 5    | NULL |
| "2019-08-04T16:00:00.000Z" | TRS1000i-082 | NULL | 2    |
| "2019-07-01T16:00:00.000Z" | TRS1000i-001 | 0    | NULL |
| "2019-07-01T16:00:00.000Z" | TRS1000i-001 | NULL | 0    |
| "2019-07-01T16:00:00.000Z" | TRS1000i-001 | 20   | NULL |
| "2019-07-01T16:00:00.000Z" | TRS1000i-001 | NULL | 0    |
+----------------------------+--------------+------+------+

На всякий случай, если вам нужны форматы json (обратите внимание, что это не точный, но правильный формат):

{
  "body": [
    {
      "file_name": "OEE.xml",
      "OEESummary": {
        "MachineID": "TRS1000i-012",
        "LotSummary": {
          "Lot": [
            {
              "@i": "0",
              "Start": "14:52:16 15/08/19",
              "Pass": "3",
              "Fail": "0"
            },
            {
              "@i": "1",
              "Start": "15:40:41 15/08/19",
              "Pass": "3",
              "Fail": "0"
            }
          ]
        },
        "Utilisation": [
          "0:01:42:48",
          "19.04%"
        ],
        "MTTR": "--",
        "IdleTime": "0:07:16:39",
        "MUBA": "57",
        "OEE": "60.55%"
      }
    }
  ],
  "header": {
    "json_metadata_revision": "v1.0.0",
    "json_metadata_datetime_creation": "14-OCT-2019_14:55:57",
    "json_metadata_uuid": "14102019145557_65b425d8-09e5-48ec-be85-e69d9a50d2e3",
    "json_metadata_type": "mvst_xml_to_json"
  }
}

Помогите, если вы знаете какие-либо методы, которые я мог бы использоватьрешить эту проблему. Ваша помощь очень ценится! Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

В верхней части вашего результирующего набора просто запрос объединения:

  WITH A AS(
  Select 1 id , 'TRS1000i-082' as Machine    , 5 pass, 2 fail union all
  Select 2 id , 'TRS1000i-001' as Machine    , 0 pass, 0 fail union all
  Select 3 id , 'TRS1000i-001' as Machine    , 20 pass, 0 fail 
  )
  SELECT ID
     ,MACHINE
     ,pass
     ,null fail
  FROM a
UNION ALL
  SELECT ID
     ,MACHINE
     ,null pass
     ,fail fail
  FROM a
  order by ID
1 голос
/ 18 октября 2019

С вашей таблицей вы можете использовать боковое соединение:

select t.date, t.machine, v.pass, v.fail
from t cross join lateral
     (values (t.pass, null), (null, t.fail)) v(pass, fail);

Я не совсем уверен, что ваш запрос имеет отношение к вопросу. Но вы можете определить его как CTE, а затем использовать результаты для t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...