我在查询时遇到了一些问题,我有一个表格,我想要挑选出标有不同字段的项目。
具体而言,传送带上的盒子已移动并标记在不同位置。
以下是我所拥有的(它不起作用 - 在内部select子句中返回多条记录,导致错误)。
字段条形码不是唯一的。它应该工作的方式是它将四处走动,并且每次通过某些区域时,将为该条形码添加新记录。我想找到已经到过3个不同区域的条形码,其中一个是lane_id LIKE(CRANE%_IN)
我知道我的错误是合乎逻辑的,但是我无法通过子查询了解同一个表上的查询。
这个概念很简单(我可以在2分钟内用任何语言完成),它需要在SQL(postgres)中完成。
SELECT barcode, lane_id
FROM acts_divert_log
WHERE lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id LIKE ('CRANE%_IN')
AND divstat IN (0, 1)
AND barcode =
(
SELECT barcode FROM acts_divert_log WHERE
lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND divstat IN (0, 1)
)
);
预期结果应该是在2个GTP0%区域和至少一个CRANE%_IN区域中看到的唯一条形码。
非常感谢任何帮助或提示。 SQL真的不是我的强项。
答案 0 :(得分:0)
尝试这样的事情:
SELECT barcode, lane_id
FROM acts_divert_log l
WHERE divstat IN (0, 1)
AND EXISTS (
SELECT barcode
FROM acts_divert_log t2
WHERE divstat IN (0, 1)
AND l.barcode = t2.barcode
GROUP BY t2.barcode
HAVING
SUM(CASE WHEN lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') THEN 1 ELSE 0 END) >= 2
AND SUM(CASE WHEN lane_id LIKE ('CRANE%_IN') THEN 1 ELSE 0 END) >= 1
)
;
答案 1 :(得分:0)
关系划分的情况。有很多种方法可以解决这个问题。一种简单快捷的方法:
SELECT barcode
, a1.lane_id AS lane_id1
, a2.lane_id AS lane_id2
, a3.lane_id AS lane_id3
FROM acts_divert_log a1
JOIN acts_divert_log a2 USING (barcode)
JOIN acts_divert_log a3 USING (barcode)
WHERE a1.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a2.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04')
AND a3.lane_id LIKE 'CRANE%_IN'
AND a1.divstat IN (0, 1)
AND a2.divstat IN (0, 1)
AND a3.divstat IN (0, 1)
AND a1.lane_id <> a2.lane_id; -- assuming you want distinct lane_ids
我们在这个相关问题下聚集了各种技术:
您需要匹配索引才能快速完成此操作。详细信息取决于有关表定义,数据分布,基数等的未公开信息。
答案 2 :(得分:0)
Select distinct Barcode, lane_id from acts_divert_log
Where Barcode in (
Select barcode from (
Select Barcode, sum(cnt_gtp) as gto
, sum(cnt_crane) as crane
from (Select Barcode
, case when (lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
Then 1 else 0 end as cnt_gtp,
, case when (lane_id like 'CRANE%_IN') then 1 else 0 end as cnt_crane
from acts_divert_log
Where divstat in (0,1)
and ((lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04'))
OR (lane_id like 'CRANE%_IN') )
) as aa
Group by barcode
) as bb
Where gtp>=2 and crane>=1
)