在带有逻辑的SELECT语句中使用MAX

时间:2012-01-16 15:20:48

标签: sql sql-server tsql max

简而言之,我需要获得部件的最新版本。确定最新版本的标准是:

  • 如果所有部件都有alpha修订版,那么基于MAX字母的最新版本
  • 如果所有部件都有数字版本,则最新版本基于MAX数字
  • 如果某些部分有字母,有些部分有数字和字母,那么最新版本将是MAX字母
  • 如果某些部分有字母,其他部分有数字,那么最新部分将基于数字的MAX,忽略字母

这可能看起来有点模糊,但希望下面的代码更清楚。

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,我知道严格来说并不是数字)。如果它是一个字母,它通常只是最后一个字符,例如甲

1 个答案:

答案 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

我将isnumericreplace放在一起,因此您每行只执行一次,然后在修订号的计算中使用它。它适用于您提供的示例数据,但如果它不是您正在寻找的正确逻辑,我们可以随时调整。

对于后代,此语法仅适用于SQL Server。