我有这个问题:
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等。
答案 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和时间戳
进行分组答案 2 :(得分:0)
对于代表用户1的37个注册的分组,您期望时间戳列包含什么?由于还有37个时间戳值,因此您需要一个聚合函数才能使其有意义。例如。如果您想要每个用户的最新注册时间戳,请使用MAX功能。