GROUP BY包含多列与多列相加

时间:2017-08-07 11:36:43

标签: sql sql-server group-by

您好我正在尝试使用GROUP BY和SUM练习,当我使用只有1列的count进行聚合时,效果很好!

SELECT
  [ActivityId]
  ,[Timestamp]
  ,COUNT(*)
  FROM [DATABASE].[db].[Log] AS ACTIVITY
  GROUP BY [ActivityId],[Timestamp]
  ORDER BY [ActivityId] DESC

返回:

ActivityId  Timestamp   (No column name)
0AF072B4-B9EB-41B3-8DF6-F9AE66BEC57E    2017-08-04 15:59:30.3592694 1
E522028D-4791-452E-B001-F6A448415DEA    2017-08-04 15:59:26.3501979 1
E522028D-4791-452E-B001-F6A448415DEA    2017-08-04 15:59:54.9596809 1
38E8E5A9-1729-42C4-B055-DE2BB4711738    2017-08-04 15:59:57.2996059 1

这不会按我想要的方式聚合,activityIds仍然保持不计其数&  聚合(它们都显示1)

SELECT
  [ActivityId]
  ,COUNT(*)
  FROM [DATABASE].[db].[Log] AS ACTIVITY
  GROUP BY [ActivityId]
  ORDER BY [ActivityId] DESC

但是上面的代码工作正常!这是正确的聚合(但只有1个字段):

ActivityId  (No column name)
0AF072B4-B9EB-41B3-8DF6-F9AE66BEC57E    1
E522028D-4791-452E-B001-F6A448415DEA    2
38E8E5A9-1729-42C4-B055-DE2BB4711738    2
3306CEB5-F476-432F-BD62-DA328C93D764    2

如果我没有在小组中包含其他字段,我会:

 "is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

我是否应该使用分组?或者我做一个子选择或什么?我想聚合activityId字段,并包括其他字段,如(时间戳或电子邮件)

2 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

SELECT l.*, COUNT(*) OVER (PARTITION BY ActivityId) as Activity_Count
FROM [DATABASE].[db].[Log] l
ORDER BY ActivityId DESC;

这会将每个活动的计数添加到每一行。

答案 1 :(得分:0)

如果在select中包含按时间戳以外的列的时间戳,则数据库不知道您要选择的给定活动的时间戳组中的哪一行。这就是为什么它坚持在未包含在分组中的所有字段周围添加聚合函数。

您可以找到每个活动ID的最早和最新时间​​戳,如下所示:

SELECT
  [ActivityId]
, MIN(Timestamp) AS EarliestActivity
, MAX(Timestamp) AS LatestActivity
, COUNT(*) AS ActivityCount
FROM [DATABASE].[db].[Log] AS ACTIVITY
  GROUP BY [ActivityId]
  ORDER BY [ActivityId] DESC