SQL - 如何在 Group By 后避免一些记录
SQL - How to avoid some records after a Group By
内部联接和分组依据之后,我得到以下输出:
Make, Model
Ferrari, A
Ferrari, B
Aston, A
Opel, A
我的问题是.. 如何从查询输出中忽略 make Ferrari
的记录,因为它在第二个 table (models) 中包含多个模型?
PS:第二个table可能包含多个记录,即使是同一型号。
我不想只忽略法拉利。我想忽略相同情况下的所有品牌(table 两个中有超过 1 个模型)。
当前查询:
select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model
使用not exists()
select c.Make, m.Model
from cars as c
inner join models as m
on c.make = m.make
where c.year = '2017'
and not exists (
select 1
from cars as i
where i.Make = c.Make
and i.Model <> c.Model)
)
group by c.Make, m.Model
您可以将 having
与 count(distinct c.Model))=1
一起用于只有 return 具有单一模型的人。
select c.Make, m.Model
from cars as c
inner join models as m
on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model
having count(distinct c.Model)=1
试试这个...
select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017' and c.make != 'Ferrari'
group by c.Make, m.Model
您需要执行某种聚合来计算每个品牌的模型数量。如果您使用的 DBMS 支持 window 函数,那么您可以使用它们来完成这项工作:
select c.make, m.model
from cars as c
inner join (
select make, model, count(*) over (partition by make) as model_count
from model
) m
on c.make = m.make
where c.year = '2017' and m.model_count = 1
您不再需要使其成为聚合查询(通过使用 GROUP BY
子句),只要 (c.make
, c.year
) 可以被认为是唯一的,对于过滤条件,然后将确保没有 make 出现超过一次。然而,为了正确性,这确实依赖于 (model.make
, model.model
) 是唯一的。
注意:我假设您正在执行您真正想要执行的连接。既然你没有提供 table 结构,我就没有别的办法了。但是,我怀疑这可能不是您真正想要执行的连接。特别是,我想知道您是否真的想要有关哪个品牌在指定年份 只生产了一个型号 的信息,如果是这样,那么看起来您需要进行更深入的更改才能实现这一目标.
内部联接和分组依据之后,我得到以下输出:
Make, Model
Ferrari, A
Ferrari, B
Aston, A
Opel, A
我的问题是.. 如何从查询输出中忽略 make Ferrari
的记录,因为它在第二个 table (models) 中包含多个模型?
PS:第二个table可能包含多个记录,即使是同一型号。
我不想只忽略法拉利。我想忽略相同情况下的所有品牌(table 两个中有超过 1 个模型)。
当前查询:
select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model
使用not exists()
select c.Make, m.Model
from cars as c
inner join models as m
on c.make = m.make
where c.year = '2017'
and not exists (
select 1
from cars as i
where i.Make = c.Make
and i.Model <> c.Model)
)
group by c.Make, m.Model
您可以将 having
与 count(distinct c.Model))=1
一起用于只有 return 具有单一模型的人。
select c.Make, m.Model
from cars as c
inner join models as m
on c.make = m.make
where c.year = '2017'
group by c.Make, m.Model
having count(distinct c.Model)=1
试试这个...
select c.Make, m.Model
from cars as c
inner join models as m on c.make = m.make
where c.year = '2017' and c.make != 'Ferrari'
group by c.Make, m.Model
您需要执行某种聚合来计算每个品牌的模型数量。如果您使用的 DBMS 支持 window 函数,那么您可以使用它们来完成这项工作:
select c.make, m.model
from cars as c
inner join (
select make, model, count(*) over (partition by make) as model_count
from model
) m
on c.make = m.make
where c.year = '2017' and m.model_count = 1
您不再需要使其成为聚合查询(通过使用 GROUP BY
子句),只要 (c.make
, c.year
) 可以被认为是唯一的,对于过滤条件,然后将确保没有 make 出现超过一次。然而,为了正确性,这确实依赖于 (model.make
, model.model
) 是唯一的。
注意:我假设您正在执行您真正想要执行的连接。既然你没有提供 table 结构,我就没有别的办法了。但是,我怀疑这可能不是您真正想要执行的连接。特别是,我想知道您是否真的想要有关哪个品牌在指定年份 只生产了一个型号 的信息,如果是这样,那么看起来您需要进行更深入的更改才能实现这一目标.