我在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
请帮助获得所需的输出。
2条答案
按热度按时间w8rqjzmb1#
您的示例数据和输出暗示您需要以下查询:
也就是说,分区是由数据的前三个字符定义的,排名顺序是由最后四位数字决定的,或者,如果有并列关系,并列关系将被值打破。
vaj7vani2#
semms您需要一个分区,因为非数字部分,和订购,因为数字部分和
value
列的情况下,与平等的数字部分联系。如果你的数据库版本是
10.0.5+
,则可以使用'[^0-9]+'
以及'[0-9]+'
模式来从data
列。因此,考虑使用以下选项:演示