В двух словах, мне нужна последняя версия детали. Критерии для определения последней редакции:
- Если все части имеют альфа-ревизию, то последняя ревизия основана на максимальном алфавите
- Если все детали имеют числовую редакцию, то последняя редакция основана на максимальном числовом значении
- Если у некоторых частей есть буква, а у некоторых - цифры и буквы, то последней редакцией будет МАКС. Алфавит
- Если у некоторых частей есть буквы, у других - цифры, то последняя будет основана на МАКСИМАЛЬНЫХ числах, игнорируя буквы
Это может показаться немного туманным, но, надеюсь, будет понятнее с кодом ниже.
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 даст желаемые результаты. Сложная часть - это 2 других правила.
Детали сгруппированы по их общим значениям, указанным выше, поэтому я ищу последнюю версию каждой общей детали.
Мне уже удалось сделать это, но это было в пользовательской функции и ужасно медленно при использовании в операторе SELECT. Поэтому я хотел бы обработать эту логику и вывести таблицу, содержащую общее значение и последнюю версию детали.
Оператор SELECT выше выведет;
A11089 A11089A
B4294 B4294C
B4323 B4323003
N96484 N96484A
когда мне нужно это вывести;
A11089 **A11089100**
B4294 B4294C
B4323 B4323003
N96484 N96484A
И последнее замечание: если ревизия числовая, то это последние 3 символа части (например, 003, я знаю, что это не совсем строго число). Если это буква, то, как правило, это только последний символ, например A