当前位置: 首页 > 知识库问答 >
问题:

分组时如何选择表的其他列?[副本]

姜卜霸
2023-03-14

请假设下表:

// mytable
+--------+-------------+---------+
|  num   | business_id | user_id |
+--------+-------------+---------+
| 3      | 503         | 12      |
| 7      | 33          | 12      |
| 1      | 771         | 13      |
| 2      | 86          | 13      |
| 1      | 772         | 13      |
| 4      | 652         | 14      |
| 4      | 567         | 14      |
+--------+-------------+---------+

我需要根据user_id对其进行分组,因此,下面是我的查询:

select max(num), user_id from mytable
group by user_id

结果如下:

// res
+--------+---------+
|  num   | user_id |
+--------+---------+
| 7      | 12      |
| 2      | 13      |
| 4      | 14      |
+--------+---------+

现在我还需要获取这些行的business_id。以下是预期的结果:

// mytable
+--------+-------------+---------+
|  num   | business_id | user_id |
+--------+-------------+---------+
| 7      | 33          | 12      |
| 2      | 86          | 13      |
| 4      | 567         | 14      |  -- This is selected randomly, because of the equality of values
+--------+-------------+---------+

知道我该怎么做吗?

共有1个答案

廖臻
2023-03-14

你不组队。你过滤。一种方法使用窗口函数,如row_number():

select t.*
from (select t.*,
             row_number() over (partition by user_id order by num desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;

另一种在(user_id,num)上使用索引性能稍好的方法是相关子查询:

select t.*
from mytable t
where t.num = (select max(t2.num)
               from mytable t2
               where t2.user_id = t.user_id
              );

当您想要汇总行时,应该考虑“分组依据”。当要选择具有特定特征的行时,您应该考虑“where”。

 类似资料:
  • 问题内容: 我在pandas数据框上使用来删除没有特定列的最小值的所有行。像这样: 但是,如果我不止这两列,其他列(例如在我的示例中)将被删除。我可以使用保留这些列,还是必须找到一种不同的方式删除行? 我的数据如下: 并应以如下形式结束: 但是我得到的是: 我一直在浏览文档,找不到任何东西。我试过了: 但是这些都不起作用(我在最后一个中意识到,语法是在创建组后进行聚合的)。 问题答案: 方法1:使

  • 我是冬眠新手,不会RTFM,所以我希望有人能帮我节省很多时间。 我的数据库中的对象之间有多对多的关系。假设员工和工作。 我想选择分配给给定员工的所有作业。我的对象乔布斯有一个正在处理它的所有员工的列表。所以,在java中,它应该是:作业job.employees.contains(员工)。除了我需要把它变成一个Hibernate查询什么的。 现在,我在选择所有东西后,正在Java中使用蛮力。 如何

  • 问题内容: 具有下表(): 另一个帮助表(): 我正在寻找一个SQL查询来输出以下内容: 所以,每一次是和是 在 响应表, 汇总 对话上下文到这一点,忽略不池中的响应结束谈话的一部分。 在上面的示例中,活动 响应文本 为1中的 3 。 我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况: 我敢肯定有更好的方法。 问题答案: 这是我的看法: 这将扫描表一次,但是我不确定它的性能是否会比您的解

  • 我有两个问题: 从表1中选择*,其中my\u值介于值1和值2之间 从表2中选择值1、值2 表2中的value1和value2的集合是唯一的。如何在第一个查询的where语句中插入查询2的所有结果集?

  • 问题内容: 我正在使用。 我得到的正确值,即最大日期。 但是对于我来说,当我真的想要第三条记录(具有最大日期值的记录)中的“ ta3”值时,只需获取第一条记录的值即可,即“ ta1”。 例如 问题答案: 您需要GROUP BY子句或更复杂的查询。 对于示例数据,这将返回3行。 您更有可能想要: 对于示例数据,这将返回1行: 在主要的DBMS中,当select-list中包含聚合列和非聚合列的混合时

  • 我有四张桌子A、B、C和D。 我需要选择值2(我从表D中猜测),其中值1和值3在表D中的同一行中,并且在表A和表C的行中都有相同的“城市”。 所以,如果表A有一行 表C有行 表D有行 然后我需要打印: