2016-02-14 17 views
1

我有一張桌子,我試圖讓表中第一個人的性別='M',第一個人的性別='F'如何獲得由另一列分區的值的第一個實例?

第一人在這種情況下= ORDER BY按字母順序排列

name | gender | .......other data 
A  M 
B  M 
C  F 
D  F 
E    
F  M 
G  F 

我如何得到一個結果表「M」的第一個實例,「F」不空/空列?

理想的結果:

name | gender | ........other data 
A  M 
C  F 

感謝您的幫助!

+2

第一:先定義第一個。 – wildplasser

+2

[在每個GROUP BY組中選擇第一行?]可能重複(http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) –

回答

2

可以使用row_number()功能,像這樣:

SELECT name,gender from (
    SELECT name,gender, 
      row_number() OVER(PARTITION BY gender ORDER BY name ASC) as rnk 
    FROM YourTable) 
WHERE rnk = 1 

您可以將性別後添加其他列,如果你想要的。在Postgres的

1
SELECT name, gender 
FROM your table 
WHERE gender = "M" 
ORDER BY NAME 
Fetch first row only 

Union all 

SELECT name, gender 
FROM your table 
WHERE gender = "F" 
ORDER BY NAME 
Fetch first row only 
+0

我建議您使用'UNION ALL'而不是'UNION';)。 –

+0

你是對的。這將有利於表現。 –

1

一種方法是使用distinct on

select distinct on (gender) t.* 
from t 
order by gender, name; 

這(方便)不需要列出所有性別的查詢,可以使用索引對(gender,name),並通常比row_number()快。當然,缺點是這不是標準的,只適用於Postgres和Postgres派生的數據庫。

+0

做什麼不同? – sagi

+0

@sagi。 。 。 http://www.postgresql.org/docs/9.5/static/sql-select.html#SQL-DISTINCT。 –

相關問題