【问题标题】:Question about aggregate functions with GROUP BY SQL Server关于 GROUP BY SQL Server 的聚合函数的问题
【发布时间】:2011-09-25 16:40:39
【问题描述】:

例如,我在不同类型的表(varchar、nvarchar、int、float、datetime 等)中有 10-15 个字段,我需要进行 GROUP BY,所以。我必须在所有这些字段上使用什么聚合功能? MAX还是别的?重要吗?

SELECT
    intFacilityRTOPID,
    MAX(ObjectSystem_r_Equipment) ObjectSystem_r_Equipment,
    MAX(ObjectBuilding_r_Equipment) ObjectBuilding_r_Equipment,
    MAX(intenum_EquipmentTypeID) intenum_EquipmentTypeID,
    MAX(correctionDate) correctionDate
FROM [RTOPv4History].[dbo].[FacilityRTOP]
WHERE cast(correctionDate as bigint) <= @correctionDate
GROUP BY intFacilityRTOPID

【问题讨论】:

  • 完全取决于您想要的结果!例如,对于每个intFacilityRTOPID,您希望返回哪个可能的ObjectSystem_r_Equipment 值?最大的,最小的,来自特定行的?
  • 只有您足够了解您的数据才能知道它是否重要。如果给定intFacilityRTOPID 的列中只有“一个值”,则 min 和 max 将返回相同的值。如果有多个不同的值,它当然会返回不同的值。这有关系吗?你告诉我。
  • 是的,我的错。我知道我的错误,谢谢。
  • 但是,如果对我来说没关系,我想要哪个值 bcz 他们都一样,我必须使用什么函数来聚合这些字段?
  • 如果没关系,那就用你喜欢的任何东西。没关系。

标签: sql sql-server


【解决方案1】:

听起来你可能不明白Group By 的作用。 Group By 建立了一组“bins”或“buckets”,由 group By 列或表达式的值定义,它们将控制查询的输出。即,查询的结果行将被限制为由 group by 列和/或表达式定义的值的唯一组合,并且每行中的所有数据都受到与“定义”匹配的原始表的子集的限制。 .

电子输出中与 group by 列/表达式之一不完全相同的任何列必须使用许多聚合函数之一来指定和/或计算要为该列生成的值。生成的值将取自原始表中与 group By 列/表达式匹配的那些行的实际表列值。所以如果你使用MAX(),你会得到最大的值子集,如果你使用AVG(),你会得到平均值,等等......

如果你真的不想做任何聚合,那么考虑只使用Distinct 关键字......

 SELECT Distinct intFacilityRTOPID, 
     ObjectSystem_r_Equipment ObjectSystem_r_Equipment,
     ObjectBuilding_r_Equipment ObjectBuilding_r_Equipment, 
     intenum_EquipmentTypeID intenum_EquipmentTypeID,
     correctionDate correctionDate 
 FROM [RTOPv4History].[dbo].[FacilityRTOP] 
 WHERE cast(correctionDate as bigint) <= @correctionDate 

【讨论】:

  • 是的,但是如果我在列中有 1000 个相同的值 - 我必须使用什么函数?那很重要么?我可以选择其中的任何一个,第一个、最后一个、最小、最大——它们都是一样的。
  • 正如其他人评论的那样,这取决于您想要什么。如果值都与Max() 相同,Min(),Avg() 会给你相同的值,Sum() 会将它们相加,STDEV() 会给你标准偏差等。你想要一组值吗?
  • 如果您只想要所有行中的值,请使用 Min() 或 Max()。但是,如果您根本不想进行任何聚合,那么请考虑使用 Distinct 关键字。
【解决方案2】:

如果互补列都相等,您可能需要

SELECT * FROM (
  SELECT DISTINCT(intFacilityRTOPID) 
  FROM [RTOPv4History].[dbo].[FacilityRTOP]
  WHERE cast(correctionDate as bigint) <= @correctionDate
) a CROSS JOIN (
  SELECT TOP(1) 
    ObjectSystem_r_Equipment,
    ObjectBuilding_r_Equipment,
    intenum_EquipmentTypeID,
    correctionDate
  FROM [RTOPv4History].[dbo].[FacilityRTOP]
  WHERE cast(correctionDate as bigint) <= @correctionDate
) b

哪个可以表现更好,具体取决于表的大小。警告:我没有尝试过这是否有效,我是凭记忆写的:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2013-02-10
    • 2014-08-24
    相关资源
    最近更新 更多