如何在SQL Server的文本列上实现MAX函数?

时间:2014-12-20 02:48:55

标签: sql sql-server nvarchar

我使用的是SQL Server 2005,并且有一个包含序列号的列,nvarchar(50)

我的问题是从表中选择max(serial_no)。序列号的长度只有7,但新的序列号现在为15.每当我选择max时,我得到一个长度为7的结果,这意味着数据是旧的。我也无法过滤它只能从长度为15的记录中进行选择,因为那时我会错过我查询的其他一些数据。

旧的序列号看起来像这样......

'SNGD001'

......,新的看起来像这样:

'SN14ABCD0000001'

编辑:我尝试创建一个没有旧序列号(5个字符长)的虚拟表,并且我得到了正确的结果。

2 个答案:

答案 0 :(得分:1)

正如已经提到的,你的问题有点难以理解。如果最大值可能是您的旧序列号之一或新的序列号之一,我相信以下应该可以解决问题:

SELECT MAX(RIGHT('0000000' + REVERSE(LEFT(REVERSE(YourTextColumn), PATINDEX('%[a-z]%', REVERSE(YourTextColumn)) - 1)), 7))
FROM YourTable

它从右侧找到第一个非数字字符,将所有内容保持在右侧。然后,它将生成的数字字符串零填充到7个字符并应用MAX函数。

答案 1 :(得分:0)

如果没有良好的样本数据来解决问题,您的问题有点难以理解。我建议将来,你会展示一些数据的例子,以获得更好的背景,尤其是测序。现在,您需要从表中获取“serial_no”的MAX(),这样您就可以检测下一个要分配的序列号。但是,您的序列号似乎是前缀字符串的串联,然后是顺序。所以,如果我要查看你的简短数据,那就是(最后3位是顺序序列化)

SNGD001
SNGD002
SNGD003
...
SNGD389, etc...

和您的新数据与最后一个(最后7位是连续序列化)

SN14ABCD0000001
SN14ABCD0000002
SN14ABCD0000003
...
SN14ABCD0002837

如果这是正确的,那么你基本上需要根据转换后缀数字序列的字符串PLUS的前3或8个字符来查看max。对于初学者,让我们一起来看看我们是否在正确的轨道上,然后您可以轻松地将前缀和序列号连接在一起,以确定下一个可用的号码。

因此,根据上述示例,您可能想知道每个前缀的最后一个数字

SNGD389   and 
SN14ABCD0002837 respective per their prefix

如果以上是正确的,我可以从...开始......

select
      case when LEN( RTRIM( yt.serial_no )) = 7
           then LEFT( yt.serial_no, 4 )
           else LEFT( yt.serial_no, 8 ) end as SerialPrefix,
      MAX( case when LEN( RTRIM( yt.serial_no )) = 7
                then CONVERT(INT, RIGHT( yt.serial_no, 3 ))
                else CONVERT(INT, RIGHT( yt.serial_no, 7 )) end ) as SerialSequence
   from
      YourTable yt
   group by
      case when LEN( RTRIM( yt.serial_no )) = 7
           then LEFT( yt.serial_no, 4 )
           else LEFT( yt.serial_no, 8 ) end as SerialPrefix

哪会导致(根据我提供的样本数据)

SerialPrefix    SerialSequence
SNGD            389
SN14ABCD        0002837

其中由于串行序列列是数字的,你可以加1,然后left-zero填充一个字符串并将两者连接在一起以便创建

SNGD390
SN14ABCD0002838