2016-02-14 16 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。 –

相关问题