带组的 Oracle 查询
Oracle query with group
我有一个场景,我需要获取同一来源的 ID 内的所有记录。下面给出的是我的输入记录集
ID SOURCE CURR_FLAG TYPE
1 IBM Y P
1 IBM Y OF
1 IBM Y P
2 IBM Y P
2 TCS Y P
3 IBM NULL P
3 IBM NULL P
3 IBM NULL P
4 IBM NULL OF
4 IBM NULL OF
4 IBM Y ON
根据上述设置,我需要 select 同一个 ID 中来源为 IBM 的所有记录 group.Within 如果至少有一个来源不是 IBM 的记录,则 ID 组,那么我不想要来自该 ID 组的任何记录。此外,我们只需要获取那些在该 ID 组中至少有一条记录具有 curr_fl='Y'
的记录
在上述情况下,即使 ID=3 的来源是 IBM,但没有 CURR_FL='Y' 的记录,我的查询不应获取 value.In在ID=4的情况下,它可以取出ID=4的所有记录,因为其中一条记录有value='Y'.
同样满足上述条件的组中,我还需要一个source_type的条件。如果有 source_type='P' 的记录,那么我只需要获取 record.If 没有 P 的记录,然后我会搜索 source_type='OF' 否则 source_type='ON'
我已经按照给定 below.But 编写了一个查询,它已经 运行 很长时间了,没有获取任何结果。有没有更好的方法来修改这个查询
select
ID,
SOURCE,
CURR_FL,
TYPE
from TABLE a
where
not exists(select 1 from TABLE B where a.ID = B.ID and source <> 'IBM')
and exists(select 1 from TABLE C where a.ID = C.ID and CURR_FL = 'Y') and
(TYPE, ID) IN (
select case type when 1 then 'P' when 2 then 'OF' else 'ON' END TYPE,ID from
(select ID,
max(priority) keep (dense_rank first order by priority asc) as type
from ( select ID,TYPE,
case TYPE
when 'P' then 1
when 'OF' then 2
when 'ON' then 3
end as priority
from TABLE where ID
in(select ID from TABLE where CURR_FL='Y') AND SOURCE='IBM')
group by ID))
我认为您可以通过 ID
对您的 table 进行一次聚合,然后检查是标志并断言没有出现非 IBM 来源。我在下面的 CTE 中执行此操作,然后返回到您的原始 table 到 return 完整匹配记录。
WITH cte AS (
SELECT
ID,
CASE WHEN SUM(CASE WHEN TYPE = 'P' THEN 1 ELSE 0 END) > 0
THEN 1
WHEN SUM(CASE WHEN TYPE = 'OF' THEN 1 ELSE 0 END) > 0
THEN 2
WHEN SUM(CASE WHEN TYPE = 'ON' THEN 1 ELSE 0 END) > 0
THEN 3 ELSE 4 END AS p_type
FROM yourTable
GROUP BY ID
HAVING
SUM(CASE WHEN CURR_FLAG = 'Y' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN SOURCE <> 'IBM' THEN 1 ELSE 0 END) = 0
)
SELECT t1.*
FROM yourTable t1
INNER JOIN cte t2
ON t1.ID = t2.ID
WHERE
t2.p_type = 1 AND t1.TYPE = 'P' OR
t2.p_type = 2 AND t1.TYPE = 'OF' OR
t2.p_type = 3 AND t1.TYPE = 'ON';
我有一个场景,我需要获取同一来源的 ID 内的所有记录。下面给出的是我的输入记录集
ID SOURCE CURR_FLAG TYPE
1 IBM Y P
1 IBM Y OF
1 IBM Y P
2 IBM Y P
2 TCS Y P
3 IBM NULL P
3 IBM NULL P
3 IBM NULL P
4 IBM NULL OF
4 IBM NULL OF
4 IBM Y ON
根据上述设置,我需要 select 同一个 ID 中来源为 IBM 的所有记录 group.Within 如果至少有一个来源不是 IBM 的记录,则 ID 组,那么我不想要来自该 ID 组的任何记录。此外,我们只需要获取那些在该 ID 组中至少有一条记录具有 curr_fl='Y'
的记录在上述情况下,即使 ID=3 的来源是 IBM,但没有 CURR_FL='Y' 的记录,我的查询不应获取 value.In在ID=4的情况下,它可以取出ID=4的所有记录,因为其中一条记录有value='Y'.
同样满足上述条件的组中,我还需要一个source_type的条件。如果有 source_type='P' 的记录,那么我只需要获取 record.If 没有 P 的记录,然后我会搜索 source_type='OF' 否则 source_type='ON'
我已经按照给定 below.But 编写了一个查询,它已经 运行 很长时间了,没有获取任何结果。有没有更好的方法来修改这个查询
select
ID,
SOURCE,
CURR_FL,
TYPE
from TABLE a
where
not exists(select 1 from TABLE B where a.ID = B.ID and source <> 'IBM')
and exists(select 1 from TABLE C where a.ID = C.ID and CURR_FL = 'Y') and
(TYPE, ID) IN (
select case type when 1 then 'P' when 2 then 'OF' else 'ON' END TYPE,ID from
(select ID,
max(priority) keep (dense_rank first order by priority asc) as type
from ( select ID,TYPE,
case TYPE
when 'P' then 1
when 'OF' then 2
when 'ON' then 3
end as priority
from TABLE where ID
in(select ID from TABLE where CURR_FL='Y') AND SOURCE='IBM')
group by ID))
我认为您可以通过 ID
对您的 table 进行一次聚合,然后检查是标志并断言没有出现非 IBM 来源。我在下面的 CTE 中执行此操作,然后返回到您的原始 table 到 return 完整匹配记录。
WITH cte AS (
SELECT
ID,
CASE WHEN SUM(CASE WHEN TYPE = 'P' THEN 1 ELSE 0 END) > 0
THEN 1
WHEN SUM(CASE WHEN TYPE = 'OF' THEN 1 ELSE 0 END) > 0
THEN 2
WHEN SUM(CASE WHEN TYPE = 'ON' THEN 1 ELSE 0 END) > 0
THEN 3 ELSE 4 END AS p_type
FROM yourTable
GROUP BY ID
HAVING
SUM(CASE WHEN CURR_FLAG = 'Y' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN SOURCE <> 'IBM' THEN 1 ELSE 0 END) = 0
)
SELECT t1.*
FROM yourTable t1
INNER JOIN cte t2
ON t1.ID = t2.ID
WHERE
t2.p_type = 1 AND t1.TYPE = 'P' OR
t2.p_type = 2 AND t1.TYPE = 'OF' OR
t2.p_type = 3 AND t1.TYPE = 'ON';