分组返回错误的结果

时间:2016-01-14 08:02:43

标签: sql-server

我有这个问题:

select e.UserId as UserId, COUNT(*) as [Registrations] from dbo.EventLog as e 
where e.EventTypeId = 3 and e.Value is not null
group by UserId

和它返回的示例数据是:

UserId Registrations

1   37

3   1

10  2

12  69

13  22

14  5

但我也想选择时间戳。为此,我在select中添加了e.[TimeStamp],它说:

  

列' dbo.EventLog.TimeStamp'在选择列表中无效,因为   它不包含在聚合函数或GROUP BY中   子句。

如果我按结果添加e.[TimeStamp],则为:

UserId Registrations TimesTamp

1   1   2013-01-09 13:29:19.143

25  1   2013-01-09 13:52:37.687

27  1   2013-01-09 15:00:03.147

27  1   2013-01-09 16:12:01.000

27  1   2013-01-10 16:00:53.757

34  1   2013-01-10 17:13:52.000

请注意id 1的注册是整行,而不是例如37,2等。

3 个答案:

答案 0 :(得分:3)

每一行的时间戳可能会有所不同,那么您实际上是从共享UserId的集合中指出哪个时间戳?

你能做的就是找到第一个时间戳:

select 
   e.UserId as UserId, 
   COUNT(*) as [Registrations],
   Min(e.Timestamp) as [First Timestamp]
from dbo.EventLog as e 
where e.EventTypeId = 3 and e.Value is not null
group by UserId

或最后一个,使用max()

答案 1 :(得分:1)

以下是原因。为什么会得到这样的结果。

您按用户ID和时间戳

进行分组
  • 您的条件可能有多个userId( e.EventTypeId = 3且e.Value不为空),但是如果按时间戳分组也是如此 只有一个用户满足该条件且具有时间戳
  • 如果您想要进行所有注册,可以选择平均值(时间戳)或最小值或最大值。
祝你好运

答案 2 :(得分:0)

对于代表用户1的37个注册的分组,您期望时间戳列包含什么?由于还有37个时间戳值,因此您需要一个聚合函数才能使其有意义。例如。如果您想要每个用户的最新注册时间戳,请使用MAX功能。