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

为其他两列的每个唯一组合选择具有Max(列值)的行

狄法
2023-03-14

我正在使用如下所示的示例表。数据集有多个组,每次对表进行写入时,数据集的RunNumber以及每个组的数据和总数都会递增。每个数据集/组组合通常都有多行,示例如下:

对于数据集和组的每个组合,我要做的是返回给定数据集/组组合中具有最大值(RunNumber)的行的所有数据。例如,上面的示例将返回:

在数据集/组匹配的地方,所有行都保留该给定组合的最大运行数。现在,我已经将其分为两个单独的查询,其中我首先查询所有不同数据集/组组合的最大值(RunNumber),然后对所有匹配项执行select*。任何帮助都将不胜感激,提前谢谢!

共有1个答案

楚勇
2023-03-14

在MySQL 5. x中,您可以使用子查询。

SELECT * 
FROM your_table
WHERE (`Group`, Dataset, RunNumber) IN (
    SELECT `Group`, Dataset, MAX(RunNumber) AS MaxRunNumber
    FROM your_table
    GROUP BY `Group`, Dataset
  );

在db上测试

替代品

--
-- LEFT JOIN on bigger
--
SELECT t.* 
FROM your_table t
LEFT JOIN your_table t2
  ON t2.`Group` = t.`Group`
 AND t2.Dataset = t.Dataset
 AND t2.RunNumber > t.RunNumber
WHERE t2.RunNumber IS NULL
ORDER BY t.`Group`, t.Dataset;

--
-- where NOT EXISTS on bigger
--
SELECT * 
FROM your_table t
WHERE NOT EXISTS (
  SELECT 1
  FROM your_table t2
  WHERE t2.`Group` = t.`Group`
    AND t2.Dataset = t.Dataset
    AND t2.RunNumber > t.RunNumber
)
ORDER BY `Group`, Dataset;

--
-- Emulating DENSE_RANK = 1 with variables
-- Works also in 5.x
--
SELECT RunNumber, `Group`, Dataset, Total
FROM
(
  SELECT 
    @rnk:=IF(@ds=Dataset AND @grp=`Group`, IF(@run=RunNumber, @rnk, @rnk+1), 1) AS Rnk
  , @grp := `Group` as `Group`
  , @ds := Dataset as Dataset
  , @run := RunNumber as RunNumber
  , Total
  FROM your_table t
  CROSS JOIN (SELECT @grp:=null, @ds:=null, @run:=null, @rnk := 0) var
  ORDER BY `Group`, Dataset, RunNumber DESC
) q
WHERE Rnk = 1
ORDER BY `Group`, Dataset;

--
-- DENSE_RANK = 1
-- MySql 8 and beyond. 
--
SELECT *
FROM
(
  SELECT *
  , DENSE_RANK() OVER (PARTITION BY `Group`, Dataset ORDER BY RunNumber DESC) AS rnk
  FROM your_table
) q
WHERE rnk = 1
ORDER BY `Group`, Dataset;
 类似资料:
  • 问题内容: 我有这个桌子; 我希望选择这样的行: 任一或= 。 另一个字段应该是唯一的。 即我想从表中选择唯一,或者我需要以下结果: 怎么做? 为什么?因为我希望构建一个类似于Facebook的收件箱,在该收件箱中,已发送和已接收的消息将被聚合,而此查询是迄今为止的瓶颈。 我正在使用Rails 3.2和Postgres 9.3。 问题答案: (not )从结果中删除重复项,从而不必要。您可能希望在

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

  • 问题内容: 我已经看到了很多解决此类问题的解决方案尤其是此SQL仅选择在Column上具有Max Value的行,但是似乎没有一个合适的解决方案: 我有以下表格布局,即附件的版本控制,这些附件绑定到实体: 输出应该是最大版本号,按group_id和Entity_id分组,如果有帮助,我只需要一个单个entity_id的列表即可: 我想出的是这种自我加入: 但是,只有在不同的实体不共享相同的组号的情

  • 问题内容: 使用以下查询和结果,我正在寻找ChargeId和ChargeType唯一的最新条目。 期望的: 问题答案: 您可以使用GROUP BY按类型和ID对项目进行分组。然后,您可以使用MAX()聚合函数来获取最近的服务月份。以下返回带有ChargeId,ChargeType和MostRecentServiceMonth的结果集

  • 问题内容: 假设我有这张桌子(小提琴可用)。 我按行对行进行分组,对于每个组,我都希望从column中获得一个值。但是,我不需要 任何 值,但是我想从具有maximal的行中获取值,并从所​​有这些中获取具有maximal的值。换句话说,我的结果应该是 当前解决方案 我知道一个查询来实现这一点: 题 但是我认为这个查询 很难看 。主要是因为它使用了一个 依赖的子查询 ,感觉就像是真正的性能杀手。因

  • 问题内容: 这应该是一个简单的问题,但我无法使其起作用:( 如何按另一列分组选择具有最大列值的行? 例如, 我有以下表格定义: 现在的问题是,我想先按结果分组,然后再从每组中选择一行,具体取决于哪一组具有最高的。 我试过了 但是,与其以正确的方式回报我,不如以同一个小组中最早的回报我。 有任何想法吗? 问题答案: 我本人为此进行了很多次努力,解决方案是以不同的方式考虑您的查询。 我希望其中具有该D