存在一个名为Species的表,其中包括Sp_name,Sp_woodtype,Sp_maxht(种类'最大高度),我被问到这个问题:
对于具有相同木材类型(sp_woodtype)的每个物种,比较它们的最大高度。输出应包括物种木材类型,较大高度的物种名称和较小高度的物种名称。
应该怎么做?
编辑1: 我试过了:
SELECT sp_woodtype, sp_name a AS Larger, sp_name b AS Smaller
FROM Species
WHERE a.sp_woodtype = b.sp_woodtpye AND a.sp_maxht>b.sp_maxht;
答案 0 :(得分:0)
您没有使用特定的RDBMS标记标记您的问题,但几乎所有现代RDBMS都应该支持窗口函数(mysql是值得注意的例外)。假设您的RDBMS支持它们,rank()
应该在这里诀窍:
SELECT sp_woodtype, sp_name, sp_maxht
FROM (SELECT sp_woodtype, sp_name, sp_maxht,
RANK() OVER (PARTITION BY sp_woodtype
ORDER BY sp_maxht ASC) AS ra,
RANK() OVER (PARTITION BY sp_woodtype
ORDER BY sp_maxht DESC) AS rd
FROM species) t
WHERE 1 IN (ra, rd)
答案 1 :(得分:0)
首先找到每sp_maxht
的最小和最大sp_woodtype
。根据这些,您可以选择行:
select s.*
from
(
select
sp_woodtype,
min(sp_maxht) as min_sp_maxht,
max(sp_maxht) as max_sp_maxht
from species
group by sp_woodtype
) agg
join species s on s.sp_woodtype = agg.sp_woodtype
and s.sp_maxht in (agg.min_sp_maxht, agg.max_sp_maxht)
order by s.sp_woodtype, s.sp_maxht;