我正在构建的查询遇到问题。我的目标是创建一个满足两个 CTE 条件的输出,然后组合输出,其中仅显示对于两个 CTE 条件都成立的 ID。我不确定我是否需要 CTE 中分区子句的行号,但我认为我需要一些东西来指定重复值,重复值是两个 CTE 中都存在的 ID。
下面的代码片段从一个较长的查询中获取输出,该查询为我提供了完整的总体:
WITH CTE1 AS
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY ID
ORDER BY DATE) AS RN --row number
FROM #complete_query_output
WHERE Decision = 'Declined'
AND xyz> 0
AND (Business_Rule_1= 1 OR Business_Rule_2= 1 OR Business_Rule_3= 1)
),
CTE2 AS
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY ID
ORDER BY DATE) AS RN
FROM #complete_query_output
WHERE abc = 1
--AND Decision = 'Approved'
)
SELECT *
FROM CTE1
UNION ALL
SELECT *
FROM CTE2
ORDER BY ID
我已经尝试添加类似下面的内容,但我没有得到所需的输出,因为 ID 字段没有显示两个字段中的 ID。
SELECT *, count(*)
FROM CTE1
GROUP BY ID
HAVING COUNT(*) > 1
UNION ALL
SELECT *, count(*)
FROM CTE2
GROUP BY ID
HAVING COUNT(*) > 1
听起来你正在寻找类似的东西
SELECT id, count(*)
(
SELECT id
FROM CTE1
UNION ALL
SELECT id
FROM CTE2
)
GROUP BY ID
HAVING COUNT(*) > 1
这会从两个 CTE 中获取所有
id
(然后与 union all
组合),然后外部查询按它们进行分组并对其进行计数。
正如您所提到的,将
group by
和 having
应用于各个 CTE 没有帮助,因为它不考虑它们的总计数。
编辑添加,正如 Stu 在评论中提到的,你可以使用
intersect
。如果您只想识别两个查询中都存在一行的情况,这比我上面建议的更干净:
类似:
SELECT id
FROM CTE1
INTERSECT
SELECT id
FROM CTE2
这不会返回计数(不清楚这是否是必需的),并且可能返回与我最初建议的结果不同的结果。如果 CTE1 有 2 行
ID
=1,CTE2 有 0 行 ID
=1,我的第一个查询会将其视为重复项,但 INTERSECT
查询不会,因此您需要了解数据并在这些情况下你想要什么。