简而言之,我需要获得部件的最新版本。确定最新版本的标准是:
这可能看起来有点模糊,但希望下面的代码更清楚。
DECLARE @PARTS TABLE
(
PART nvarchar(100),
PART_GENERIC nvarchar(100)
)
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4294A', 'B4294')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4294B', 'B4294')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4294C', 'B4294')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4323001', 'B4323')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4323002', 'B4323')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('B4323003', 'B4323')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('N9648400A', 'N96484')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('N96484A', 'N96484')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('A11089100', 'A11089')
INSERT INTO @PARTS (PART, PART_GENERIC) VALUES ('A11089A', 'A11089')
SELECT PART_GENERIC, MAX(PART) FROM @PARTS GROUP BY PART_GENERIC
在上述规则1和2的情况下,使用MAX功能将获得所需的结果。棘手的部分是另外两条规则。
部件按上面的通用值分组,所以我正在寻找每个通用部件的最新版本。
我已经设法做到这一点,但是它是在用户定义的函数中,并且在SELECT语句中使用时非常慢。因此,我想处理这个逻辑并输出一个包含该部分的通用值和最新版本的表。
上面的SELECT语句将输出;
A11089 A11089A
B4294 B4294C
B4323 B4323003
N96484 N96484A
当我需要输出时;
A11089 **A11089100**
B4294 B4294C
B4323 B4323003
N96484 N96484A
最后一点,如果修订版是数字,则是该部分的最后3个字符(例如003,我知道严格来说并不是数字)。如果它是一个字母,它通常只是最后一个字符,例如甲
答案 0 :(得分:3)
你可以试试这个 - 它是我能做到的最快的工作:
select
part_generic,
isnull(
max(case when minorRevisionNumeric = 1 then part else null end),
max(case when minorRevisionNumeric = 0 then part else null end)
) as revision
from
(select
part,
part_generic,
isnumeric(replace(part, part_generic, '')) as minorRevisionNumeric
from
@parts
) y
group by
part_generic
我将isnumeric
和replace
放在一起,因此您每行只执行一次,然后在修订号的计算中使用它。它适用于您提供的示例数据,但如果它不是您正在寻找的正确逻辑,我们可以随时调整。
对于后代,此语法仅适用于SQL Server。