mysql实现dense_rank_MySQL 5.6-类似于DENSE_RANK的功能,无需订购

对于MySQL 5.6版本,通过设置会话变量并利用内部查询,可以实现类似DENSE_RANK的效果。当groupVarian相同但caseID不同的情况下,nameVarian按照caseID的顺序进行编号。提供的解决方案展示了如何创建新的nameVarian列,使得相同groupVarian的行拥有相同的排名,并按caseID升序排列。
摘要由CSDN通过智能技术生成

bd96500e110b49cbb3cd949968f18be7.png

I have a table like this:

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

|caseID|groupVarian|

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

|1 |A,B,C,D,E |

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

|2 |A,B,N,O,P |

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

|3 |A,B,N,O,P |

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

|4 |A,B,C,D,F |

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

|5 |A,B,C,D,E |

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

I would like to get a new column nameVarian, such that same groupVarian values have same ranking represented by nameVarian (eg: v1, v2 and so on). However, nameVarian values assigned to a specific groupVarian should be as per the order of caseID (in the order they appear inside the table).

The output should be something like:

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

|caseID|groupVarian|namevarian

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

|1 |A,B,C,D,E |v1 |

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

|2 |A,B,N,O,P |v2 |

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

|3 |A,B,N,O,P |v2 |

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

|4 |A,B,C,D,F |v3 |

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

|5 |A,B,C,D,E |v1 |

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

解决方案

For MySQL version < 8.0 (OP's version is 5.6):

The problem statement looks like needing DENSE_RANK functionality over groupVarian; however it is not. As explained by @Gordon Linoff:

You appear to want them enumerated by the order they appear in the

data.

Assuming that your table name is t (please change the table and field name(s) accordingly for your code). Here is an approach utilizing session variables (for older versions of MySQL), giving the desired result (

SET @row_number = 0;

SELECT t3.caseID,

t3.groupVarian,

CONCAT('v', t2.num) AS nameVarian

FROM

(

SELECT

(@row_number:=@row_number + 1) AS num,

t1.groupVarian

FROM

(

SELECT DISTINCT groupVarian

FROM t

ORDER BY caseID ASC

) AS t1

) AS t2

INNER JOIN t AS t3

ON t3.groupVarian = t2.groupVarian

ORDER BY t3.caseID ASC

Additionally: My earlier attempt to emulate DENSE_RANK functionality, works well. Although previous query can also be tweaked slightly to achieve DENSE_RANK functionality. However, the following query is more efficient, as it creates lesser Derived tables, and avoids JOIN on groupVarian:

SET @row_number = 1;

SET @group_varian = '';

SELECT inner_nest.caseID,

inner_nest.groupVarian,

CONCAT('v', inner_nest.num) as nameVarian

FROM (

SELECT

caseID,

@row_number:=CASE

WHEN @group_varian = groupVarian THEN @row_number

ELSE @row_number + 1

END AS num,

@group_varian:=groupVarian as groupVarian

FROM

t

ORDER BY groupVarian

) AS inner_nest

ORDER BY inner_nest.caseID ASC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值