Sql 如何根据列值查询重复行?

Sql 如何根据列值查询重复行?,sql,postgresql,subquery,Sql,Postgresql,Subquery,我正试图找出如何根据pass和fail列复制行。下面是我到目前为止查询过的表 查询代码如下所示。我正在从json查询 SELECT to_date(LotSummary ->> 'Start', 'HH24:MI:SS DD/MM/YY')AS "Date", Machine AS "Machine", LotSummary ->> 'Pass' AS "Pass", LotSummary ->> 'Fail' AS "Fai

我正试图找出如何根据pass和fail列复制行。下面是我到目前为止查询过的表

查询代码如下所示。我正在从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
假设我想将其作为重复项进行查询,以分离通过失败值,如下所示:

+----------------------------+--------------+------+------+
|            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格式(请注意,它不是确切的格式,但格式是正确的):


如果您知道我可以用来解决此问题的任何技术,请务必提供帮助。非常感谢你的帮助!谢谢。

对于您的桌子,您可以使用横向连接:

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

的结果。对于您的表,您可以使用横向联接:

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

的结果,这就是union查询:

  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

在结果集的顶部,它只是一个联合查询:

  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

是的,我觉得我的标题有点误导,应该是“根据列值将行选择为重复行”。总之,我的观点是对的。我会花一些时间来尝试这个,但我认为它会起作用。非常感谢。是的,我觉得我的标题有点误导,应该是“根据列值将行选择为重复行”。总之,我的观点是对的。我会花一些时间来尝试这个,但我认为它会起作用。非常感谢。也行。非常感谢。也行。非常感谢。