2012-05-22 53 views
1

假設我有一張人員表,其中包含行name,gender (M/F)ageSQL查詢僅限於記錄的一個子集

會是什麼一個SQL查詢樣子返回:

  • 所有女人
  • 最多的5名男性人
  • 人年齡

NB排序。這是一個人爲的例子。此外,Postgres特定的答案歡迎。

+1

你的意思是一個單一的查詢,可以一起做所有的事情嗎?就像所有女性和前5名男性的'UNION'產品按年齡交叉排序? –

回答

4
SELECT name, gender, age 
    FROM (SELECT name, gender, age 
      FROM people 
      WHERE gender = 'F' 
     UNION ALL 
     (SELECT name, gender, age 
      FROM people 
      WHERE gender = 'M' 
      LIMIT 5 
     ) 
     ) x 
    ORDER BY age 

注意上面的解決方案沒有選擇任何特定的男性。如果需要,可以將排序應用於男性子查詢。

這一個年齡號令男性修剪發生之前:

SELECT name, gender, age 
    FROM (SELECT name, gender, age 
       ,ROW_NUMBER() OVER (PARTITION BY gender ORDER BY age) gender_count 
      FROM people 
     ) x 
    WHERE gender = 'F' 
     OR gender_count <= 5 

BTW,我發現「性別」通常用於語法引用。在這種情況下,「性」就是我會用到的術語。

+0

小改進:['UNION ALL'](http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-UNION)而不是'UNION'。 –