猿问

MySQL中的ROW_NUMBER()

MySQL中的ROW_NUMBER()

MySQL是否有一种很好的方式来复制SQL Server功能ROW_NUMBER()

例如:

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

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


HUX布斯
浏览 13103回答 4
4回答

www说

我总是最终遵循这种模式。鉴于此表:+------+------+|    i |    j |+------+------+|    1 |   11 ||    1 |   12 ||    1 |   13 ||    2 |   21 ||    2 |   22 ||    2 |   23 ||    3 |   31 ||    3 |   32 ||    3 |   33 ||    4 |   14 |+------+------+你可以得到这个结果:+------+------+------------+|    i |    j | row_number |+------+------+------------+|    1 |   11 |          1 ||    1 |   12 |          2 ||    1 |   13 |          3 ||    2 |   21 |          1 ||    2 |   22 |          2 ||    2 |   23 |          3 ||    3 |   31 |          1 ||    3 |   32 |          2 ||    3 |   33 |          3 ||    4 |   14 |          1 |+------+------+------------+通过运行此查询,不需要定义任何变量:SELECT a.i, a.j, count(*) as row_number FROM test aJOIN test b ON a.i = b.i AND a.j >= b.jGROUP BY a.i, a.j

梦里花落0921

我希望每个(col1,col2)对的行具有单个最高col3。这是一个分组最大值,是最常见的SQL问题之一(因为它看起来应该很简单,但实际上并非如此)。我常常喜欢null-self-join:SELECT t0.col3FROM table AS t0LEFT JOIN table AS t1 ON t0.col1=t1.col1 AND t0.col2=t1.col2 AND t1.col3>t0.col3WHERE t1.col1 IS NULL;“获取表格中没有其他行匹配col1的行,col2具有更高的col3。”(您会注意到这一点,如果多行具有相同的col1,则大多数其他groupwise-maximum解决方案将返回多行,col2 ,col3。如果这是一个问题,你可能需要一些后期处理。)

郎朗坤

MySQL中没有排名功能。你可以得到的最接近的是使用一个变量:SELECT t.*,         @rownum := @rownum + 1 AS rank  FROM YOUR_TABLE t,         (SELECT @rownum := 0) r那么在我的案例中如何运作呢?我需要两个变量,col1和col2各有一个?当col1改变时,Col2需要以某种方式重置..?是。如果是Oracle,则可以使用LEAD函数在下一个值处达到峰值。值得庆幸的是,Quassnoi涵盖了您需要在MySQL中实现的逻辑。

一只斗牛犬

SELECT     @i:=@i+1 AS iterator,     t.*FROM     tablename AS t,    (SELECT @i:=0) AS foo
随时随地看视频慕课网APP

相关分类

MySQL
我要回答