我问这个问题有点愚蠢,因为我觉得这很容易,但是由于某些原因,我无法更新查询以不基于两个条件选择特定项目。
假设我有这样的数据:
ID Name Variant Count1
110 Bob Type1 0
110 Bob Type2 1
120 John Type1 1
因此,如您所见,我们有两个BOB行,它们的ID相同,但变量不同(类型1和类型2)。我希望只能看到鲍勃的其中一个。
所需结果:
110 Bob Type2
120 John Type1
所以我一直在做类似的事情
Select ID, Name, Variant, sum(count1) from tbl1
where (id not in (110) and Variant <> 'type1')
Group by Id,name,variant
请不要使用COUNT作为条件,因为在我的示例中,恰恰是我不想看到的行的Count = 0。可能会有所不同。
我有很多行,在这些行中,我可以具有多个具有不同VARIANTS的相同ID的多个实例。我希望根据Variant值排除ID的某些实例
更新:
它与最新变体无关,与特定变体有关。所以我只是希望基本上能够使用我使用ID和VARIANT的子句来删除该特定行。
答案 0 :(得分:2)
像执行操作一样对数据进行汇总(分组)是一种处理方法,尽管where条件有些过分。如果您只想查看ID和Name的唯一组合,那么另一种方法就是使用“ distinct”语句。
select distinct Id, Name
from tbl1
如果您始终希望查看特定变体中的数据,则只需将该条件包括在where子句中,就不必担心使用不重复或汇总。
select *
from tbl1
where Variant = 'Type 1'
如果您始终想查看与最新版本有关的记录,则可以使用窗口功能来查看。
select a.Id, a.Name, a.Variant
from
(
select *, row_number() over (partition by Id order by Variant desc) as RowRank
from tbl1
) a
where RowRank = 1
;
如果没有可预测的排除模式,则必须维护一个排除列表。这不是理想的方法,但是如果您想在SQL本身中维护它,则可以进行如下查询。
select *
from tbl1
-- Define rows to exlcude
where not (Id = 110 and Variant = 'Type 1') -- Your example
and not (Id = 110 and Variant = 'Type 3') -- Theoretical example
;
更好的解决方案是创建一个排除参考表,以维护其中的所有排除。然后,您可以简单地否定联接到该表以检索所需的结果。
答案 1 :(得分:2)
您是否考虑过使用排除表,可以在其中放置要排除的ID和变体组合? (在此示例中,我仅使用了临时表,您可以始终使用用户表,因此排除表将始终可用)
以下是根据您的示例我的意思的示例:
if object_id('tempdb..#temp') is not null
drop table #temp
create table #temp (
ID int,
Name varchar(20),
Variant varchar(20),
Count1 int
)
if object_id('tempdb..#tempExclude') is not null
drop table #tempExclude
create table #tempExclude (
ID int,
Variant varchar(20)
)
insert into #temp values
(110,'Bob','Type1',0),
(110,'Bob','Type2',1),
(120,'John','Type1',1),
(120,'John','Type2',1),
(120,'John','Type2',1),
(120,'John','Type2',1),
(120,'John','Type3',1)
insert into #tempExclude values (110,'Type1')
select
t.ID,
t.Name
,t.Variant
,sum(t.Count1) as TotalCount
from
#temp t
left join
#tempExclude te
on t.ID = te.ID
and t.Variant = te.Variant
where
te.id is null
group by
t.ID,
t.Name
,t.Variant
以下是结果:
答案 2 :(得分:1)
我认为您想要的逻辑是这样的:
Select ID, Name, Variant, sum(count1)
from tbl1
where not (id = 110 and variant = 'type1')
Group by Id, name, variant;
对于第二种情况,只需继续添加:
where not (id = 110 and variant = 'type1') and
not (id = 314 and variant = 'popsicle')
您也可以使用排除列表来表达这一点:
select t.ID, Name, t.Variant, sum(t.count1)
from tbl1 t left join
(values (111, 'type1'),
(314, 'popsicle')
) v(id, excluded_variant)
on t.id = v.id and
t.variant = v.excluded_variant
where v.id is not null -- doesn't match an exclusion criterion
group by Id, name, variant;