MySQL 使用列 LIKE 值进行分区

MySQL Partition using column LIKE values

我在 MySQL 中有一个下面的 table 叫做“测试”。

data        value
ABC>1234    5678
ABC>2345    2435
ABC>3456    4567
DEF>4567    5656
DEF>5678    7535
DEF>6789    7983
GHI>7890    6748
GHI>8901    2973
GHI>8901    3024

现在我希望根据数据字段中的第一个关键字直到大于符号 (>) 对 table 进行分区,并希望获得 RANK()。

为了实现这个,我运行下面查询。

SELECT *, RANK() OVER (PARTITION BY `data`) FROM `test`

在 运行 上面的查询之后,我得到了以下输出。

data        value   RANK()
ABC>1234    5678    1
ABC>2345    2435    1
ABC>3456    4567    1
DEF>4567    5656    1
DEF>5678    7535    1
DEF>6789    7983    1
GHI>7890    6748    1
GHI>8901    2973    1
GHI>8901    3024    2

但所需的输出应如下所述。

data        value   RANK()
ABC>1234    5678    1
ABC>2345    2435    2
ABC>3456    4567    3
DEF>4567    5656    1
DEF>5678    7535    2
DEF>6789    7983    3
GHI>7890    6748    1
GHI>8901    2973    2
GHI>8901    3024    3

请帮助获得所需的输出。

您的示例数据和输出表明您需要此查询:

SELECT *,
    RANK() OVER (PARTITION BY SUBSTRING_INDEX(data, '>', 1)
                 ORDER BY SUBSTRING_INDEX(data, '>', -1), value) rnk
FROM test;

即分区由数据的前三个字符定义,排名顺序由最后四位数字决定,或者,如果出现平局,则平局将被值打破。

由于非数字部分,您需要进行分区,并且由于数字部分和 value 列对于相等数字部分的情况需要排序。

如果您的数据库版本是 10.0.5+,那么您可以使用 '[^0-9]+''[0-9]+' 模式从 data 列中提取那些子字符串部分。所以,考虑使用作为一个选项:

SELECT *, RANK() OVER 
         (PARTITION BY REGEXP_SUBSTR( `data`, '[^0-9]+' ) 
              ORDER BY REGEXP_SUBSTR( `data`, '[0-9]+' ), value) AS RANK
  FROM `test`

Demo