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