当前位置: 首页 > 面试题库 >

SQL:在多列上使用GROUP BY和MAX

桂志诚
2023-03-14
问题内容

嘿,我有一个SQL查询问题。让我们以这个示例数据为例

itemID  catID  attrib1  attrib2
  1       1       10       5   
  2       1       10       7
  3       1        5      10
  4       2       18      15

我想返回每个类别的最佳商品(attrib1优先于attrib2)

显然,“从test_table GROUP BY catID中选择SELECT
catID,MAX(attrib1),MAX(attrib2)”不起作用,因为它将为第一只猫返回10和10。

那么,有没有办法告诉MySQL从attrib2行中选择最大值,而仅考虑attrib1也是最大值的那些呢?即返回以下数据

 catID  attrib1  attrib2
   1       10       7   
   2       18      15

问题答案:

您可以获取最佳的attrib1值,然后加入attrib2值,并为每个attrib1值获取最佳值:

select t2.catID, t2.attrib1, max(t2.attrib2)
from
(
  select catID, max(attrib1) as attrib1
  from test_table
  group by catID
) t1
inner join test_table t2 on t2.catID = t1.catID and t2.attrib1 = t1.attrib1
group by t2.catID, t2.attrib1


 类似资料:
  • 我试图将数据框的多行合并成一行,不同值的列合并成一个列表。有多个列具有不同的值。 在一个列表中只需设置一列('b'),效果很好,但我不知道如何对多个列进行设置。 数据帧: 首选数据帧后期操作: 有没有一个简单的方法可以做到这一点?

  • 问题内容: 我试图将记录插入表中,并且在插入此记录时,我的“项目评分列”(在下面的示例中为“ PG”)出现“此处不允许列”错误: 但是当我拿出“ PG”时,它在“美国棒球经典赛”上引发了错误。 这里发生了什么? 问题答案: 用双引号引起来,这意味着它不是字符串。字符串在SQL中用单引号分隔。但我建议将其编写为:

  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 文档显示了如何使用以输出列名为键的dict一次对groupby对象应用多个函数: 但是,这只对Series groupby对象有效。并且当类似地将dict传递给groupby数据帧时,它希望键是将应用该函数的列名。 我想做的是对几个列应用多个函数(但某些列将被多次操作)。此外,一些函数将依赖于groupby对象中的其他列(如sumif函数)。我当前的解决方案是逐列执行,并执行与上面的代码类似的操作

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行

  • 我用这个最小的可复制的例子来说明我的问题。我已经设法解决了这个问题,但我确信还有更优雅的编码方式。 这个问题是关于基于多个标准的二元分类。为了满足要求,一个甜甜圈(编码1)需要至少3(或更多)的分数:“a”标准项中的至少一个、“B”标准项中的至少两个和“C”标准项中的至少三个。如果不满足这些要求,将不奖励甜甜圈(编码0)。