Использование MAX в операторе SELECT с логикой - PullRequest
3 голосов
/ 16 января 2012

В двух словах, мне нужна последняя версия детали. Критерии для определения последней редакции:

  • Если все части имеют альфа-ревизию, то последняя ревизия основана на максимальном алфавите
  • Если все детали имеют числовую редакцию, то последняя редакция основана на максимальном числовом значении
  • Если у некоторых частей есть буква, а у некоторых - цифры и буквы, то последней редакцией будет МАКС. Алфавит
  • Если у некоторых частей есть буквы, у других - цифры, то последняя будет основана на МАКСИМАЛЬНЫХ числах, игнорируя буквы

Это может показаться немного туманным, но, надеюсь, будет понятнее с кодом ниже.

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

1 Ответ

3 голосов
/ 16 января 2012

Вы можете попробовать это - это самое быстрое, что я могу заставить его работать:

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, так что вы делаете это только один раз в строке, а затем используете это в calc для номера ревизии. Он работает с предоставленными вами образцами данных, но если это не совсем правильная логика для того, что вы ищете, мы всегда можем откорректировать.

Для потомков этот синтаксис будет работать только на SQL Server.

...