我正在使用 Oracle DB。我有一个聚合脚本。我们发现表中的某些行是重复的、不需要的,因此不应添加到总和中。
现在假设我在 select 语句之后使用 Distinct 命令,将在聚合之前或之后应用不同的命令。
如果使用
SELECT DISTINCT
,那么结果集将不会有重复行。
如果您使用
SELECT COUNT(DISTINCT)
,则计数将仅计算不同值。
如果您正在考虑使用
SUM(DISTINCT)
(或 DISTINCT
与任何其他聚合函数),请注意。我从未使用过它(除了作为演示),并且我已经编写了相当多的查询。
确实需要从源头解决问题。例如,如果帐户重复,则
SUM(DISTINCT)
不会区分帐户,仅通过分配给帐户的值来区分。你需要弄清楚逻辑。
当你说你有重复的行时 - 你必须清楚地了解某些特定列的组合的唯一性。
如果您期望某些列组合在指定组中是唯一的,则可以使用遵循以下模式的查询来检测与该组合不同的组。
select <your group by columns>
from <your table name>
group by <your group by predicate>
having (max(A)!=min(A) or max(B)!=min(B) or max(C)!=min(C))
然后你必须决定如何处理这个问题。我建议清理并向表添加唯一约束。
对于表中需要唯一的列组合不具有重复值的行,您提到的聚合查询将成功运行。使用我的示例,您可以使用倒置的having谓词来获取该部分数据的聚合。
会是这样的
select <your aggregate functions, counts, sums, averages and so on>
from <your table name>
group by <your group by predicate>
having (max(A)=min(A) and max(B)=min(B) and max(C)=min(C))
如果您必须包含打破唯一性期望的组,您必须以某种方式对要使用组中的变体进行合格的选择 - 例如,如果您的其中一个列碰巧表达,您可以选择最后一个或第一个有关行创建时间的信息。