我正在使用oracle数据库。我有一个聚合脚本。我们发现表中的一些行是重复的,不需要的,因此不应该添加到总和中。现在假设我在select语句之后使用Distinct命令,那么distinct命令是在聚合之前应用还是在聚合之后应用。
roejwanj1#
如果使用SELECT DISTINCT,则结果集将没有重复行。如果使用SELECT COUNT(DISTINCT),则计数将只计算非重复值。如果您正在考虑使用SUM(DISTINCT)(或DISTINCT与任何其他聚合函数),请注意,我从未使用过它(除了作为演示),并且我已经编写了相当数量的查询。你真的需要从源头上解决这个问题。例如,如果账户是重复的,那么SUM(DISTINCT)并不区分账户之间的区别,只通过分配给账户的值。你需要正确的逻辑。
SELECT DISTINCT
SELECT COUNT(DISTINCT)
SUM(DISTINCT)
DISTINCT
r6hnlfcb2#
当你说你有重复的行时--你必须清楚地知道某些特定列组合的唯一性。如果您希望某些列组合在指定的组中是唯一的,则可以使用遵循以下模式的查询来检测偏离该组合的组。
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 predicate 来获取该部分数据的聚合。大概是这样的
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))
如果你必须包含打破唯一性期望的组,你必须以某种方式对要使用的组中的变量进行限定选择--例如,如果你的一列碰巧表达了关于行创建时间的信息,你可以选择最后一个变量或第一个变量。
2条答案
按热度按时间roejwanj1#
如果使用
SELECT DISTINCT
,则结果集将没有重复行。如果使用
SELECT COUNT(DISTINCT)
,则计数将只计算非重复值。如果您正在考虑使用
SUM(DISTINCT)
(或DISTINCT
与任何其他聚合函数),请注意,我从未使用过它(除了作为演示),并且我已经编写了相当数量的查询。你真的需要从源头上解决这个问题。例如,如果账户是重复的,那么
SUM(DISTINCT)
并不区分账户之间的区别,只通过分配给账户的值。你需要正确的逻辑。r6hnlfcb2#
当你说你有重复的行时--你必须清楚地知道某些特定列组合的唯一性。
如果您希望某些列组合在指定的组中是唯一的,则可以使用遵循以下模式的查询来检测偏离该组合的组。
然后你必须决定如何处理这个问题。我建议清理并向表中添加唯一约束。
您提到的聚合查询将成功地运行于表中的行,这些行对于需要唯一的列组合不具有重复值。使用我的示例,您可以使用反向having predicate 来获取该部分数据的聚合。
大概是这样的
如果你必须包含打破唯一性期望的组,你必须以某种方式对要使用的组中的变量进行限定选择--例如,如果你的一列碰巧表达了关于行创建时间的信息,你可以选择最后一个变量或第一个变量。