2017-05-23 56 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;