当前场景: 我有这个查询,它对两组数据进行联合,然后根据排名选择字段 但是根据我的分析,可以在 UNION 的一侧删除整个数据集
分析: 因此,如果您查看以下查询 - 我认为,我们可以完全忽略并删除由表连接生成的数据集:P、Q、R、S 和 T
我也可以在这里用 union 替换 unionall 吗
查询:
SELECT OUTERV.f1, ... OUTERV.f30
FROM
(
SELECT
unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by unionV.orderNUM_ asc) rank_
FROM
(
SELECT f1 .. few fields, 1 as ORDERNUM_
FROM
A
JOIN B on A.id = B.id
JOIN ( SELECT few remaining fields FROM C )
C ON C.id = B.id
JOIN D ON C.id = D.id
JOIN E ON E.id = D.id
JOIN F on F.id = E.id
UNION ALL
SELECT
f1, f2, ...f30 , 2 as ORDERNUM_
FROM
P
JOIN Q ON P.id = Q.id
JOIN R ON Q.id = R.id
JOIN S on S.id = R.id
JOIN T on S.id = T.id
)unionV
)
OUTERV where
OUTERV.rank_ = 1
请求: 请确认我的分析是否正确。
最佳答案
我不同意分析;它做出了可能不正确的假设。但是,如果您可以保证并集第二部分中的所有 IFC 值都存在于并集的第一部分中,并且始终如此,那么您的分析是正确的。
Essentially what the query you have does is trust the data from the first set of the union more than the second set of the union. However, if there is an IFC value in the second set not in the first; it must come from the 2nd part of the union; thus removing the second part of the union could remove records.
例子:
- 假设 unionV.ifc 来自并集两侧的表
A
和P
- 假设
A
&P
中有以下数据
.
A.ifc
A
B
P.ifc
A
Z
在您当前的查询中,结果将是
A (from A table)
B (from A table)
Z (from P Table)
如果你消除并集的第二部分,你就消除了 P,因此 Z 将被排除在结果之外;因此它们不相等,您不能删除并集的第二部分。
现在,如果第二个集合中定义的所有 ifc 都包含在联合定义的第一个集合中,则始终为真;那么是的,你可以消除联盟的第二部分。因为第一套首先包含完整的一套。但是,如果这不是保证正确的陈述,那么当前在 a...F 和 P...T 上使用联合的方法会生成“主集”
关于sql - 使用 UNION ALL 和 RANK 优化 Hive 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516273/