0
我想基于最大值或最小值来聚合行,其中最大/最小值由业务规则而不是固有值确定。换句话说,我需要创建一个自定义的最大/最小值 - 不使用CLR。我在下面的代码片段中有一个独立工作的例子,但我觉得必须有一个更简单的方法。查找最大/最小任意优先级
在这种特殊情况下,我需要IPA列的业务优先级由以下[IPAMap] CTE中显示的[Seq]值定义。然后,我从[TestData] table/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
这是正确的,但我希望有人能告诉我一个更简单的方法来完成同样的工作。
你的'DISTINCT'是多余的。使用'GROUP BY'可以保证结果集中的行是不同的。 –
@Mark:固定 - 删除它。 –
你可以在聚集中使用CASE语句,MIN(CASE MA.IPA WHEN 3 THEN 7 WHEN 4 THEN 6等)但是我怀疑这是简单得多还是高性能的,除了导致稍微简单的执行计划。如果映射不改变,为什么不把它们放在永久性的桌子上? – carpii