从左侧删除重复项 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
250
是 max(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
中找到 TaskName
。 CROSS 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
网上看了一些例子,可惜没有找到解决办法。
我有这样的数据。
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
250
是 max(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
中找到 TaskName
。 CROSS 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