Sql 查询以搜索2年并排除1
我为这个措词奇怪的问题道歉,因为我不太确定在不解释情况的情况下如何命名标题 我目前正在使用一个vendor表,它为每个vendor提供一个唯一的ID,但是该表没有规范化 例如,IDSql 查询以搜索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 = '
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