【问题标题】:MySQL Partition using column LIKE values使用列 LIKE 值的 MySQL 分区
【发布时间】:2020-06-27 02:47:32
【问题描述】:

我在 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

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

请帮助获得所需的输出。

【问题讨论】:

  • 您按什么值排序以获得所需的排名?

标签: mysql sql mariadb rank partition-by


【解决方案1】:

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

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

也就是说,分区由数据的前三个字符定义,排名顺序由最后四个数字确定,或者,如果出现平局,则按值打破平局。

【讨论】:

    【解决方案2】:

    你需要一个非数字部分的分区,以及数字部分和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

    【讨论】:

    • 大于号 (>) 后面的字符串不一定是数字。
    • 好吧,请用扩展的样本数据集解释您还需要什么。顺便说一句,你的数据库版本是什么@BARUN?
    • 样本数据集可以是任何东西,而不是特定于数字或非数字。但是,它们只有大于符号,我们可以通过它来拆分它们并考虑第一部分。版本是 10.5.3
    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多