从左侧删除重复项 table

Removing duplicates from the left table

网上看了一些例子,可惜没有找到解决办法。

我有这样的数据。

Table一个

TaskName Pattern
123      Did not find A
124      Did not find B

并且在这个TableB

中生成了数据模式
VariantId LocalVariantId Pattern
345       222            Did not find A
345       223            Did not find A
345       224            <Something else>
346       234            Did not find A

Table C

VariantId ParseRange
345       100
345       200
346       50

我需要把三个表的数据结合起来生成这样的数据

TaskName ParseRange
123      250 

250max(345) + max(346) = 200 + 50

的总和

我已经编写了查询,但问题在 Table B 中重复出现。

Table C开始,我

select max(ParseRange) from TableC group by VariantId

所以这给了我 200(对于 VariantId=345

但是当我加入 Table B 时,除非我这样做 group by TableB.VariantId, 我得到了重复项,所以结果总和与 250.

不同

这是我的查询

SELECT
    TaskName
    , SUM(TC.ParseRange)
FROM
    TableB
    JOIN
    (
        SELECT
            VariantId
            , MAX(ParseRange)
        FROM TableC
        GROUP BY VariantId
    ) AS TC ON TableB.VariantId = TC.VariantId
    -- also join with table A on Pattern
GROUP BY TaskName

这是一种可能的解决方案:SQL Fiddle

示例数据

DECLARE @TableA TABLE (TaskName int, Pattern varchar(50));
INSERT INTO @TableA ([TaskName], [Pattern]) VALUES
(123, 'Did not find A'),
(124, 'Did not find B');

DECLARE @TableB TABLE ([VariantId] int, [LocalVariantId] int, [Pattern] varchar(50));
INSERT INTO @TableB ([VariantId], [LocalVariantId], [Pattern]) VALUES
(345, 222, 'Did not find A'),
(345, 223, 'Did not find A'),
(345, 224, '<Something else>'),
(346, 234, 'Did not find A');

DECLARE @TableC TABLE ([VariantId] int, [ParseRange] int);
INSERT INTO @TableC ([VariantId], [ParseRange]) VALUES
(345, 100),
(345, 200),
(346, 50);

解决方案

首先,我们列出了 TableC 的所有变体及其最大值 ParseRange - 这是 CTE_Variants

然后对于每个 VariantId 我们需要从 TableA 中找到 TaskNameCROSS APPLY 做到了 - 对于每个 VariantId,我们从 TableA 中选择一个与 TOP(1) 相关的行。在此示例中,选择哪一行并不重要,因此 CROSS APPLY 中的查询没有 ORDER BY。如果您的数据更复杂,您可能需要添加排序以选择正确的行。

然后将结果按TaskName分组计算最终总和。

WITH
CTE_Variants
AS
(
    SELECT
        VariantId
        ,MAX(ParseRange) AS MaxParseRange
    FROM @TableC
    GROUP BY VariantId
)
SELECT
    CA.TaskName
    , SUM(CTE_Variants.MaxParseRange) AS SumMaxParseRange
FROM
    CTE_Variants
    CROSS APPLY
    (
        SELECT TOP(1) TA.TaskName
        FROM
            @TableB AS TB
            INNER JOIN @TableA AS TA ON TA.Pattern = TB.Pattern
        WHERE
            TB.VariantId = CTE_Variants.VariantId
    ) AS CA
GROUP BY
    CA.TaskName
;

结果集

TaskName SumMaxParseRange
123      250