有关GROUP BY SQL Server的聚合函数的问题

时间:2011-09-25 16:40:40

标签: sql sql-server

我在表格中有10-15个不同类型的字段(varchar,nvarchar,int,float,datetime e.t.c.),我需要制作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

2 个答案:

答案 0 :(得分:2)

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

eoutput中与列/表组之一不完全相同的任何列必须使用众多聚合函数之一来指定和/或计算为该列生成的值。生成的值将仅从原始表中与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 

答案 1 :(得分:0)

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

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

可以根据表的大小执行更好的操作。警告:我没有尝试,如果这有效,我正在通过记忆写作: - )