问题描述
我想返回全名相同但策略不同的所有记录和项目。而且其中一种策略必须像'%TG%'
解决方法
您可以使用exists
:
select t.*
from t
where exists (select 1
from t t2
where t2.fullname = t.fullname and
t2.strategy <> t.strategy and
(t2.strategy like '%TG%' or t.strategy like '%TG%')
);
,
如果您对每个需求进行两次查询并得到结果的交集,那么您可以解决问题
-- Names with different strategies
SELECT FULLNAME
FROM tablenameyoudidnotsay
GROUP BY FULLNAME
HAVING COUNT(DISTINCT STRATEGY) >1
INTERSECT
-- Names like TG
SELECT FULLNAME
FROM tablenameyoudidnotsay
WHERE STRATEGY LIKE '%TG%'
请注意,您也可以在第一部分中使用Gordon查询-以已实现的索引运行速度更快。
相交与内部联接相同-但我认为使用相交会更清楚。
,您可以使用窗口功能执行此操作。比较strategy
的最小值和最大值:如果它们不同,则您知道至少有两个不同的值。至于“ TG”策略,您可以使用最大窗口数。
所以:
select fullname,strategy
from (
select t.*,min(strategy) over(partition by fullname) min_strategy,max(strategy) over(partition by fullname) max_strategy,max(case when strategy like '%TG%' then 1 else 0 end) over(partition by fullname) has_tg
from mytable t
) t
where min_strategy <> max_strategy and has_tg = 1