sql问题,挑战

标签 sql greatest-n-per-group

我想得到

id   a    b     c
--------------------
1    1    100   90
6    2    50    100

...来自:

id   a    b     c
--------------------
1    1    100   90
2    1    300   50
3    1    200   20
4    2    200   30
5    2    300   70
6    2    50    100

它是被 a 分组的 b 最小的行。

用sql怎么做?

编辑

我以为可以通过

select * from table group by a having min(b);

后来发现不对

但是可以用 having 语句来实现吗?

我正在使用 MySQL

最佳答案

SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
  ON (t1.a=t2.a AND t1.b>t2.b)
WHERE t2.a IS NULL;

这是可行的,因为不应该有具有相同 a 和较小的 b 的匹配行 t2


更新:这个解决方案与其他人已经确定的关系有同样的问题。但是,我们可以打破联系:

SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
  ON (t1.a=t2.a AND (t1.b>t2.b OR t1.b=t2.b AND t1.id>t2.id))
WHERE t2.a IS NULL;

假设在平局的情况下,具有较低 id 的行应该是我们选择的行。


这并不能解决问题:

select * from table group by a having min(b);

因为 HAVING MIN(b) 只测试组中的最小值不为假(在 MySQL 中意味着不为零)。 HAVING 子句中的条件用于从结果中排除组,而不是用于选择要返回的组中的行。

关于sql问题,挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960621/

相关文章:

postgresql - 检索聚合和日期运算符的附加列

mysql - MySQL 中的 FORCE INDEX - 我把它放在哪里?

mysql - 数据库中每个数据的类别由一个特定的 id 并且只允许为每个类别 mysql 获取 2

sql - 我可以在 SQL 中执行 max(count(*)) 吗?

c# - 防止SQL注入(inject)的好方法有哪些?

php - 无法添加或更新子行外键约束失败 mysql 错误号 : 1452

MySQL Not Null 命令没有执行任何操作

mysql - 计算彼此不在 10 秒内的行数

MySQL 添加、DATE_FORMAT 和 CONCAT_WS

mysql - 从另一个表中获取第三个表中每一行的前 3 个