如何为列选择不同的行

时间:2010-05-31 05:57:49

标签: sql

我有一张表x,就像下面的表格一样:

id | name | observed_value |
1  | a    | 100            |
2  | b    | 200            |
3  | b    | 300            |
4  | a    | 150            |
5  | c    | 300            |

我想进行查询,以便在结果集中只有一个名称的记录:

  (1, a, 100)
  (2, b, 200)
  (5, c, 300)

如果有多个记录对应一个名称,请在上表中说“a”,我只选择其中一个。

在我目前的实现中,我做了一个这样的查询:

select x.* from x , 
(select distinct name, min(observed_value) as minimum_val
from x group by name) x1
where x.name = x1.name and x.observed_value = x1.observed_value;

但我认为可能有更好的方法,如果您知道,请告诉我,提前谢谢。

修改

我正在使用MySQL而且我的表包含的内容超过了此处显示的三列,所以在我看来,内部查询无法满足我的要求。

4 个答案:

答案 0 :(得分:3)

SELECT  t.*
FROM    (
        SELECT  DISTINCT name
        FROM    mytable
        ) q
JOIN    mytable t
ON      t.id =
        (
        SELECT  id
        FROM    mytable ti
        WHERE   ti.name = q.name
        ORDER BY
                ti.name, ti.observed_value, ti.id
        LIMIT 1
        )

(name, observed_value, id)上创建一个索引,以使此查询更有效。

答案 1 :(得分:1)

仅使用分组

select id, name, min(observed_value) as minimum_val  from x group by name;

答案 2 :(得分:1)

由于您没有指定您使用的DBMS,我将提供几个解决方案:

如果您使用的是具有FIRST()聚合函数的DBMS,则可以使用:

SELECT 
  FIRST(id) as id, 
  name, 
  FIRST(observed_value) as observed_value 
FROM x
GROUP BY name;

如果您使用的是MySQL,则可以将ORDER BYLIMIT结合使用,以获得与FIRST()聚合函数类似的内容。

SELECT
  ( SELECT x2.id 
    FROM x as x2 
    WHERE x2.name = x.name 
    ORDER BY observed_value ASC 
    LIMIT 1
  ) AS id,
  name,
  MIN(observed_value) as observed_value
FROM x
GROUP BY name

答案 3 :(得分:0)

您的查询看起来太复杂而无法实现...只是按列名对查询进行分组,并对其余列使用聚合函数。例如

SELECT name, min(id), min(observed_value) FROM x GROUP BY name

(显然,如果您想为每个名称获取其他值,请选择min以外的聚合函数。)