名称相同但策略不同的SQL Return

问题描述

enter image description here

我想返回全名相同但策略不同的所有记录和项目。而且其中一种策略必须像'%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