MySQL 中的 ROW_NUMBER()

新手上路,请多包涵

MySQL 中是否有一种复制 SQL Server 函数的好方法 ROW_NUMBER()

例如:

 SELECT
    col1, col2,
    ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3 DESC) AS intRow
FROM Table1

然后,例如,我可以添加一个条件以将 intRow 限制为 1,以获得每个 (col1, col2) 对的最高 col3 的单行。

原文由 Paul 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 616
2 个回答

我想要每个 (col1, col2) 对具有最高 col3 的行。

这是一个 groupwise maximum ,是最常见的 SQL 问题之一(因为它看起来应该很容易,但实际上并非如此)。

我经常为 null-self-join 感到高兴:

 SELECT t0.col3
FROM table AS t0
LEFT JOIN table AS t1 ON t0.col1=t1.col1 AND t0.col2=t1.col2 AND t1.col3>t0.col3
WHERE t1.col1 IS NULL;

“获取表中没有匹配 col1,col2 的其他行具有更高 col3 的行。” (如果不止一行具有相同的 col1、col2、col3,您会注意到这一点以及大多数其他分组最大解决方案将返回多行。如果这是一个问题,您可能需要一些后处理。)

原文由 bobince 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于另一列的分区,一种方法是@abcdn 所描述的。但是,它的性能很低。 我建议使用不需要将表与自身连接的代码: 考虑同一张表。

在此处输入图像描述

你可以像这样进行分区:

 set @row_num := 0;
set @j:= 0;

select IF(j= @j, @row_num := @row_num + 1, @row_num := 1) as row_num,
       i, @j:= j as j
from tbl fh
order by j, i;

结果是这样的:

在此处输入图像描述

优点是我们不需要将表与自身连接起来

原文由 Afshin Amiri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题