基本SQL比较

时间:2017-05-23 19:07:47

标签: mysql sql notation

存在一个名为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;

2 个答案:

答案 0 :(得分:0)

您没有使用特定的RDBMS标记标记您的问题,但几乎所有现代RDBMS都应该支持窗口函数(是值得注意的例外)。假设您的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;