2017-05-23 54 views
-2

存在一个表叫做物种,其中包括SP_NAME,Sp_woodtype,Sp_maxht(物种的最大高度),我问这个问题:基本SQL比较

对于具有相同woodtype(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

SO是不是一个网站让人们做你的功课。你有什么尝试? –

+0

SELECT sp_woodtype,sp_name a AS较大,sp_name b AS较小 从种类 WHERE a.sp_woodtype = b.sp_woodtpye AND a.sp_maxht> b.sp_maxht; – betamech

+1

此外,https://stackoverflow.com/questions/44142731/granddaughter-of-a-tree-sql-query-表名和行看起来非常相似,在那个问题。 –

回答

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) 
+0

我的不好,忘了提及它应该在MySQL中。 – betamech

0

首先找到的最小和每sp_woodtype最大sp_maxht。根据这些你选择行:

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;