Sql 如何根据列值查询重复行?
我正试图找出如何根据pass和fail列复制行。下面是我到目前为止查询过的表 查询代码如下所示。我正在从json查询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
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
是的,我觉得我的标题有点误导,应该是“根据列值将行选择为重复行”。总之,我的观点是对的。我会花一些时间来尝试这个,但我认为它会起作用。非常感谢。是的,我觉得我的标题有点误导,应该是“根据列值将行选择为重复行”。总之,我的观点是对的。我会花一些时间来尝试这个,但我认为它会起作用。非常感谢。也行。非常感谢。也行。非常感谢。