【问题标题】:SQL query: same rowsSQL查询:相同的行
【发布时间】:2014-09-19 13:40:42
【问题描述】:

我无法找到正确的 sql 查询。我想选择具有唯一 x 值的所有行,如果存在具有相同 x 值的行,那么我想选择具有最大 y 值的行。例如,我将我的数据库的一部分放在下面。

    ID  x   y
    1   2   3
    2   1   5
    3   4   6
    4   4   7
    5   2   6

然后,所选行应该是 ID 为 2、4 和 5 的行。

这就是我目前所得到的

SELECT *
FROM base
WHERE x IN
     (
          SELECT x 
          FROM base
          HAVING COUNT(*) > 1
     )

但这只会导致出现多次的行。我添加了标签 R、postgresql 和 sqldf,因为我在 R 中使用这些包。

【问题讨论】:

  • 请编辑问题以包含您提供的数据的示例结果。

标签: sql r postgresql sqldf


【解决方案1】:

你可以试试这个查询:

select x, max(y) from base group by x;

而且,如果您还希望结果中的 id 列:

select base.*
from base join (select x, max(y) from base group by x) as maxima
    on (base.x = maxima.x and base.y = maxima.max);

【讨论】:

    【解决方案2】:

    示例:

    CREATE TABLE tmp(id int, x int ,y int);
    INSERT INTO .....

    test=# SELECT x, max(y) AS y FROM tmp GROUP BY x; x |是的 ---+--- 4 | 7 1 | 5 2 | 6

    【讨论】:

      【解决方案3】:

      这是用 ANSI SQL 制定查询的典型方法:

      select b.*
      from base b
      where not exists (select 1
                        from base b2
                        where b2.x = b.x and
                              b2.y > b.y
                       );
      

      在 Postgres 中,您可以使用 distinct on 来提高性能:

      select distinct on (x) b.*
      from base b
      order by x, y desc;
      

      【讨论】:

      • 您还必须与 select 联合以获取集合的另一半,当没有 X 值时选择 Y 值
      • @JamesB 。 . .我不确定你的评论指的是什么。所有行在问题中都有xy 值,并且没有提到没有x 值。
      • 很公平,我误解了问题最初的措辞(我的评论现在没有意义!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多