使用 GROUP BY 时如何选择分区内的最佳行

Posted

技术标签:

【中文标题】使用 GROUP BY 时如何选择分区内的最佳行【英文标题】:how to choose best row inside a partition when using GROUP BY 【发布时间】:2015-04-17 13:38:45 【问题描述】:

在 bigquery 中,我希望能够通过在另一列上应用条件来选择不在按列分组列表中的列。

假设我有以下列 group, id, datecreated

和以下查询: select group, max(datecreated) from table group by group

我希望查询还返回带有max(datecreated) 的行的id

到目前为止,我已经了解到聚合函数仅适用于一列。一个想法是连接创建日期和id,获取 MAX(),然后使用正则表达式提取 ID。 我觉得应该有一个更简单的解决方案。

【问题讨论】:

SELECT id FROM table ORDER BY datecreated DESC GROUP BY group LIMIT 1. 最近的日期将在顶部.... 除非我遗漏了什么。 我需要能够返回每个组内按日期创建的第一行 然后在你的问题中编辑这个?它当前的读取方式看起来确实像是您正在从 ONE 组中寻找 ONE ID :)。示例输入/所需输出总是有助于解决数据库问题 您也可以查看这个答案 - ***.com/questions/29681036/…,它显示了两种替代方法。首先类似于 Pentium10 答案,但使用 FIRST_VALUE 和 LAST_VALUE 函数。 【参考方案1】:

您可以使用Window Functions,按组分区,然后按时间降序选择第一个。

SELECT *
FROM
  (SELECT g,
          v,
          row_number() over (partition BY g
                             ORDER BY t DESC) AS POSITION
   FROM
     (SELECT 1 AS g,
             1 AS t,
             10 AS v),
     (SELECT 1 AS g,
             2 AS t,
             20 AS v),
     (SELECT 1 AS g,
             3 AS t,
             15 AS v))
WHERE POSITION=1

对于这个小数据集返回

+---+----+----------+---+
| g | v  | position |   |
+---+----+----------+---+
| 1 | 15 |        1 |   |
+---+----+----------+---+

【讨论】:

以上是关于使用 GROUP BY 时如何选择分区内的最佳行的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用group by和where字段名相同的条件

当 sql_mode=only_full_group_by 时,在 mysql 中完成 Group By 工作的最佳方法是啥

SQL - GROUP BY和ORDER BY MIN

如何以最佳方式按两列进行 GROUP BY 和计数?

使用 group by 和 like 语句时如何让 SQL 使用 where 条件

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中