代码之家  ›  专栏  ›  技术社区  ›  satoru

如何为列选择不同的行

sql
  •  1
  • satoru  · 技术社区  · 15 年前

    我有一张桌子 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 回复  |  直到 15 年前
        1
  •  3
  •   Quassnoi    15 年前
    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)

        2
  •  1
  •   Salil    15 年前

    仅使用分组方式

    select id, name, min(observed_value) as minimum_val  from x group by name;
    
        3
  •  1
  •   Senseful    15 年前

    由于您没有指定要使用的DBMS,因此我将提供两种解决方案:

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

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

    如果您使用的是MySQL,那么可以使用 ORDER BY LIMIT 得到类似于 第一()

    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
    
        4
  •  0
  •   Tommi    15 年前

    你的查询看起来太复杂了。。。只需按列名对查询进行分组,并对其余的列使用聚合函数。例如

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

    (显然,选择聚合函数而不是 min 如果要为每个名称获取其他值。)