为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL中的ROW_NUMBER()

MySQL中的ROW_NUMBER()

HUX布斯 2019-05-25 14:47:07
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)对最高的单行。
查看完整描述

4 回答

?
www说

TA贡献1775条经验 获得超8个赞

我总是最终遵循这种模式。鉴于此表:


+------+------+

|    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 a

JOIN test b ON a.i = b.i AND a.j >= b.j

GROUP BY a.i, a.j


查看完整回答
1 反对 回复 2019-05-25
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

我希望每个(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。如果这是一个问题,你可能需要一些后期处理。)


查看完整回答
反对 回复 2019-05-25
?
郎朗坤

TA贡献1921条经验 获得超9个赞

MySQL中没有排名功能。你可以得到的最接近的是使用一个变量:

SELECT t.*, 
       @rownum := @rownum + 1 AS rank  FROM YOUR_TABLE t, 
       (SELECT @rownum := 0) r

那么在我的案例中如何运作呢?我需要两个变量,col1和col2各有一个?当col1改变时,Col2需要以某种方式重置..?

是。如果是Oracle,则可以使用LEAD函数在下一个值处达到峰值。值得庆幸的是,Quassnoi涵盖了您需要在MySQL中实现的逻辑


查看完整回答
反对 回复 2019-05-25
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

SELECT 

    @i:=@i+1 AS iterator, 

    t.*

FROM 

    tablename AS t,

    (SELECT @i:=0) AS foo


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 13014 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信