我在表格中有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
答案 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
可以根据表的大小执行更好的操作。警告:我没有尝试,如果这有效,我正在通过记忆写作: - )