查找值是否存在于第二列中的任何位置并 return 结果
Find if a value exists anywhere in a second column and return a result
我需要将一列数据与另一列数据匹配,如果第一列存在于第二列中的任何位置,则结果应为“0.5”(1/2),否则如果不匹配或交叉两列结果应为“0”(零)。
我有 table,其中包含以下数据:
Job_Id link_Id
2 3
3 2
4 5
5 4
6 null
7 8
8 7
10 null
预期结果:
Job_Id link_Id cycle
2 3 0.5
3 2 0.5
4 5 0.5
5 4 0.5
6 null 0
7 8 0.5
8 7 0.5
10 null 0
我的查询:
select t.job_id
, t.link_id
, round((case when t.link_job_id IS NULL then 1 else null end))/2 cycles
from T_QCMS_JOB_STATE_HIS t
这不太行
您的 table 看起来可能是分层的,在这种情况下 recursive CTE/sub-query factoring clause 可能会在将来帮助您。
要获得当前结果,您只需要进行自连接:
select coalesce(l.job_id, j.job_id) as job_id
, l.link_id
, case when l.link_id is not null then 0.5 else 0 end as cycle
from t_qcms_job_state_his j
left outer join t_qcms_job_state_his l
on j.job_id = l.link_id;
JOB_ID LINK_ID CYCLE
---------- ---------- ----------
2 3 .5
3 2 .5
4 5 .5
5 4 .5
7 8 .5
8 7 .5
10 0
6 0
8 rows selected.
外连接用于处理并非所有 link ID 都存在的事实。
另一种不符合 ANSI 标准但只涉及单个 table 扫描的方法是使用 Oracle 的 FIRST
函数,这明显更令人困惑但效率更高:
with the_data as(
select job_id
, max(link_id) keep (dense_rank first order by case when job_id = link_id then 0 else 1 end) as link_id
from t_qcms_job_state_his
group by job_id
)
select job_id
, link_id
, case when link_id is not null then 0.5 else 0 end as cycle
from the_data
为所需的输出使用超前和滞后函数
SELECT job_id
,link_id
,nvl(CASE
WHEN lead(job_id) OVER (
ORDER BY job_id
) = link_id
AND lead(link_id) OVER (
ORDER BY job_id
) = job_id
OR lag(job_id) OVER (
ORDER BY job_id
) = link_id
AND lag(link_id) OVER (
ORDER BY job_id
) = job_id
THEN 0.5
END,0) status1
FROM Table1
为什么不只是标准的外部联接?
select a.job_id, b.link_id, case when b.link is not null then 0.5 else 0 end cycle
from tb a left outer join tb b
on a.job_id = b.link_id;
由于没有创建 table 并且提供了数据,所以是徒手编写的。根据需要采用。
我需要将一列数据与另一列数据匹配,如果第一列存在于第二列中的任何位置,则结果应为“0.5”(1/2),否则如果不匹配或交叉两列结果应为“0”(零)。
我有 table,其中包含以下数据:
Job_Id link_Id
2 3
3 2
4 5
5 4
6 null
7 8
8 7
10 null
预期结果:
Job_Id link_Id cycle
2 3 0.5
3 2 0.5
4 5 0.5
5 4 0.5
6 null 0
7 8 0.5
8 7 0.5
10 null 0
我的查询:
select t.job_id
, t.link_id
, round((case when t.link_job_id IS NULL then 1 else null end))/2 cycles
from T_QCMS_JOB_STATE_HIS t
这不太行
您的 table 看起来可能是分层的,在这种情况下 recursive CTE/sub-query factoring clause 可能会在将来帮助您。
要获得当前结果,您只需要进行自连接:
select coalesce(l.job_id, j.job_id) as job_id
, l.link_id
, case when l.link_id is not null then 0.5 else 0 end as cycle
from t_qcms_job_state_his j
left outer join t_qcms_job_state_his l
on j.job_id = l.link_id;
JOB_ID LINK_ID CYCLE
---------- ---------- ----------
2 3 .5
3 2 .5
4 5 .5
5 4 .5
7 8 .5
8 7 .5
10 0
6 0
8 rows selected.
外连接用于处理并非所有 link ID 都存在的事实。
另一种不符合 ANSI 标准但只涉及单个 table 扫描的方法是使用 Oracle 的 FIRST
函数,这明显更令人困惑但效率更高:
with the_data as(
select job_id
, max(link_id) keep (dense_rank first order by case when job_id = link_id then 0 else 1 end) as link_id
from t_qcms_job_state_his
group by job_id
)
select job_id
, link_id
, case when link_id is not null then 0.5 else 0 end as cycle
from the_data
为所需的输出使用超前和滞后函数
SELECT job_id
,link_id
,nvl(CASE
WHEN lead(job_id) OVER (
ORDER BY job_id
) = link_id
AND lead(link_id) OVER (
ORDER BY job_id
) = job_id
OR lag(job_id) OVER (
ORDER BY job_id
) = link_id
AND lag(link_id) OVER (
ORDER BY job_id
) = job_id
THEN 0.5
END,0) status1
FROM Table1
为什么不只是标准的外部联接?
select a.job_id, b.link_id, case when b.link is not null then 0.5 else 0 end cycle
from tb a left outer join tb b
on a.job_id = b.link_id;
由于没有创建 table 并且提供了数据,所以是徒手编写的。根据需要采用。