Sql 查询以搜索2年并排除1

Sql 查询以搜索2年并排除1,sql,teradata,Sql,Teradata,我为这个措词奇怪的问题道歉,因为我不太确定在不解释情况的情况下如何命名标题 我目前正在使用一个vendor表,它为每个vendor提供一个唯一的ID,但是该表没有规范化 例如,ID10000003744450在表中多次出现,每行数据不同 有很多列,但目前对我来说唯一重要的是ID和year列。我试图找到2013年、2014年但不是2015年有争议的供应商 到目前为止,我已经: select * from table where ls_d_yr = '2013' or ls_d_yr = '

我为这个措词奇怪的问题道歉,因为我不太确定在不解释情况的情况下如何命名标题

我目前正在使用一个vendor表,它为每个vendor提供一个唯一的ID,但是该表没有规范化

例如,ID
10000003744450
在表中多次出现,每行数据不同

有很多列,但目前对我来说唯一重要的是ID和year列。我试图找到2013年、2014年但不是2015年有争议的供应商

到目前为止,我已经:

select * 
from table
where ls_d_yr = '2013'
   or ls_d_yr = '2014'
我需要通过删除任何具有2013/2014年度且不应具有列出2015的任何行的供应商来过滤此结果

这是专栏


如果2013年和2014年中有一年,请使用
不存在
来排除ID在2015年有ls_d_年

select * 
from table t1
where ls_d_yr IN ('2013', '2014')
  and not exists (select 1 from table t2
                  where t2.ID = t1.ID
                    and t2.ls_d_yr = '2015')
如果2013年和2014年都需要,则添加一个
分组依据
,并使用
拥有
,以确保提供两个不同的年份:

select ID 
from table t1
where ls_d_yr IN ('2013', '2014')
  and not exists (select 1 from table t2
                  where t2.ID = t1.ID
                    and t2.ls_d_yr = '2015')
group by ID
having count(distinct ls_d_yr) = 2

您可以为此使用
不存在

select * 
from table AS t1
where ls_d_yr IN ('2013', '2014') AND
      NOT EXISTS (SELECT 1
                  FROM table AS t2
                  WHERE t1.ID = t2.ID AND ls_d_yr = '2015')

一种方法是使用聚合和
拥有

select t.vendor
from table t
group by t.vendor
having sum(case when ls_d_yr = '2013' then 1 else 0 end) > 0 and
       sum(case when ls_d_yr = '2014' then 1 else 0 end) > 0 and
       sum(case when ls_d_yr = '2015' then 1 else 0 end) = 0;
条款中的每个条件都有为期一年的
测试。
>0
表示该年存在一个或多个记录。
=0
表示不存在任何记录

这一逻辑是基于这样的陈述:“我试图找到2013年、2014年但不是2015年有行的供应商。”我没有遵循最后一段中的逻辑

select to_char(id), ls_d_yr 
  from table 
 where ls_d_yr like '%2014%' 
    or ls_d_yr like '%2013%';

类似的东西。

另一种变体,应该可以在Teradata和Aster(以及可能每种其他DBMS)中使用:



如果你阅读了这个问题,就可以很清楚地看到@Alessandroniciforo我的问题给出了部分答案,因为我已经缩小了2013年和2014年的供应商范围。但我需要从这些结果中删除任何供应商,这些供应商在这些结果之外有2015年的任何行。您在评论中提到
Aster
Teradata Studio
只是一个客户,所以
Aster
Teradata
?很抱歉,我正在使用Teradata Studio。我相信我正在使用Aster。我对这个应用程序有点陌生,所以我只是在询问,好像我在使用sqldeveloper,我知道这不是最聪明的。感谢所有花时间回答的人!这个社区太棒了!有点太慢了。我在7秒钟前写了同样的答案!。。。但是你似乎已经把这个问题推到了最前面,@jarlh:)尝试了这一点,并根据需要替换了表和ID列标题,但在aster中使用此查询时出现错误:(这看起来像是我应该做的。t1或t2来自哪里?我只查询了一个表。我在填写表的情况下尝试了此查询,但它似乎给了我错误。即使添加了AS in。t1和t2是表别名。由于同一个表使用了两次,我给出了不同的“实例”唯一的名称。错误?哪些?您使用的是哪种dbms?(我的答案是符合ANSI SQL-99标准的核心。)对不起,我是这个网站的新手。有没有办法上传评论中的截图?我现在正在使用Teradata studio进行查询。非常感谢!这是一种完全不同于我预期的方法。我一定会尝试一下!@stevepark…别害羞:什么样的错误?你输入了正确的表和列吗名称?@steve park:这个逻辑与Gordon的相似,他的更通用,而我的只适用于这个特定的场景……这确实有效,但我认为我的案例需要一些更具体的东西。谢谢你的时间!!
select vendor
from table
where ls_d_yr in ('2013','2014','2015') -- probably numbers instead of strings?
group by vendor
having min(ls_d_yr) = '2013' -- at least one row from 2013
   and max(ls_d_yr) = '2014' -- at least one row from 2014, but none from 2015