mysql分区

vwhgwdsa  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(321)

我在mysql中有一个名为“test”的下表。

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

现在我希望根据第一个关键字对表进行分区,直到数据字段中大于symbol(>),并希望得到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

请帮助获得所需的输出。

w8rqjzmb

w8rqjzmb1#

您的示例数据和输出暗示您需要以下查询:

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

也就是说,分区是由数据的前三个字符定义的,排名顺序是由最后四位数字决定的,或者,如果有并列关系,并列关系将被值打破。

vaj7vani

vaj7vani2#

semms您需要一个分区,因为非数字部分,和订购,因为数字部分和 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`

演示

相关问题