【问题标题】:SQL MIN across multiple columns with a GROUP BY使用 GROUP BY 跨多个列的 SQL MIN
【发布时间】:2013-02-16 08:10:00
【问题描述】:

我正在尝试使用以下信息的表格:

+----+---+---+
| ID | X | Y |
+----+---+---+
| A  | 1 | 3 |
| A  | 1 | 1 |
| A  | 1 | 2 |
| A  | 1 | 7 |
| B  | 2 | 2 |
| B  | 3 | 3 |
| B  | 1 | 9 |
| B  | 2 | 4 |
| B  | 2 | 1 |
| C  | 1 | 1 |
+----+---+---+

我希望能够在两列中选择最小值,按第一列分组 - “X”列比 Y 列更重要。例如,查询应该返回如下内容:

+----+---+---+
| ID | X | Y |
+----+---+---+
| A  | 1 | 1 |
| B  | 1 | 9 |
| C  | 1 | 1 |
+----+---+---+

有什么想法吗?到目前为止,我已经浏览了数十篇文章和实验,但没有运气。

谢谢, 詹姆斯

【问题讨论】:

  • 你在用什么RDBMSRDBMS 代表关系数据库管理系统RDBMS is the basis for SQL,适用于所有现代数据库系统,如 MS SQL Server、IBM DB2、Oracle、MySQL 等...
  • 但是 ID B 的最小 Y 是 1,而不是 9

标签: sql grouping min


【解决方案1】:

您似乎想要具有最小 x 值的 。并且,如果 x 上有重复项,则取 y 最小的那个。

为此,请使用row_number()

select id, x, y
from (select t.*,
             row_number() over (partition by id order by x, y) as seqnum
      from t
     ) t
where seqnum = 1

如果你的数据库不支持窗口函数,你仍然可以用 SQL 来表达:

select t.id, t.x, min(t.y)
from t join
     (select id, MIN(x) as minx
      from t
      group by id
     ) tmin
     on t.id = tmin.id and t.x = tmin.minx
group by t.id, t.x

【讨论】:

    【解决方案2】:

    如果您的 RDBMS 支持窗口函数,

    SELECT ID, X, Y
    FROM
            (
                SELECT ID, X, Y,
                        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY X, Y) rn
                FROM    tableName
            ) d
    WHERE   rn  = 1
    

    【讨论】:

    • 像魅力一样工作。对于任何想通过 JOINS/etc 从其他表中获取信息的人,请在子查询中加入并从那里开始。
    猜你喜欢
    • 2014-08-29
    • 2013-04-06
    • 2012-07-25
    • 2021-01-15
    • 2012-07-25
    • 2011-10-21
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多