Я пытаюсь агрегировать строки на основе значения max или min, где max / min определяется бизнес-правилом, а не внутренним значением. Другими словами, мне нужно создать собственный максимум / мин - без использования CLR. У меня есть рабочий автономный пример во фрагменте ниже, но я чувствую, что должен быть более простой способ.
В этом конкретном случае мне нужно, чтобы бизнес-приоритет столбца IPA определялся значением [Seq], показанным в CTE [IPAMap] ниже. Затем я беру произвольный набор строк из таблицы [TestData] / cte (в этом образце всего четыре строки) и объединяю их в две строки, в которых выбраны правильные значения IPA на основе приоритета.
--Table [IPAMap] holds all possible values for [IPA], and reflects the relative
--'priority' of each with the [Seq] column. This table is used as a lookup for
--business rules.
;WITH IPAMap (Seq, IPA) AS (
SELECT 1, 'Q' UNION ALL
SELECT 2, 'S' UNION ALL
SELECT 3, 'A' UNION ALL
SELECT 4, 'L'
)
--Table [TestData] represents the real data.
, TestData (CustomerID, IPA) AS (
SELECT '123', 'A' UNION ALL
SELECT '123', 'S' UNION ALL
SELECT '234', 'L' UNION ALL
SELECT '234', 'Q'
)
--Table [PartyIPASeq] finds the lowest Seq rank from [TestData]
,PartyIPASeq (CustomerID, IPASeq) AS (
SELECT
CustomerID,
MIN(IP.Seq)
FROM TestData [TD]
INNER JOIN IPAMap [IP] ON IP.IPA = TD.IPA
GROUP BY CustomerID
)
--The final selection provides the key and the 'IPA' with the lowest rank
SELECT TD.CustomerID, TD.IPA
FROM TestData [TD]
INNER JOIN IPAMap [IP] ON IP.IPA = TD.IPA
INNER JOIN PartyIPASeq [SEQ] ON SEQ.CustomerID = [TD].CustomerID
AND SEQ.IPASeq = IP.Seq
Результат запроса выше:
CustomerID IPA
234 S
123 Q
Это правильно, но я надеюсь, что кто-то может показать мне более простой способ выполнить ту же работу.