是否可以只对列值的第一个实例执行sql count()?
我想计算每个用户的初始公司订阅数 在下面的数据集中,我希望user1的计数为是否可以只对列值的第一个实例执行sql count()?,sql,sql-server,count,Sql,Sql Server,Count,我想计算每个用户的初始公司订阅数 在下面的数据集中,我希望user1的计数为3,user2的计数为0。因为user2订阅的两家公司之前都是user1订阅的 id user companyId activity ----------------------------------- 1 1 101 subscribe 2 1 101 unsubscribe 3 1 102
3
,user2的计数为0
。因为user2订阅的两家公司之前都是user1订阅的
id user companyId activity
-----------------------------------
1 1 101 subscribe
2 1 101 unsubscribe
3 1 102 subscribe
4 1 103 subscribe
5 2 102 unsubscribe
6 2 102 subscribe
7 2 103 unsubscribe
8 2 103 subscribe
这在SQL中可能吗?如果可能,我将如何进行
欢迎对问题措辞进行任何改进,因为我一直在努力解释清楚。您可以使用窗口功能: 查看它在上运行。您可以使用子查询(
fs
如下)获取与每个公司的第一个订阅相关联的id
,然后为该子集计算每个用户的公司数,如下所示:
select
user,
count(*) as initial_subscriptions
from
(
select companyId, min(id) as id
from the_table
where activity = 'subscribe'
group by companyId
) as fs
inner join the_table on the_table.id = fs.id
group by
user;
id代表时间顺序吗?是的。id越低,创建的越早。假设
id
列是IDENTITY
列,我不认为它代表插入时间。虽然不常见,但在某些情况下,id可能会被无序分配。最好有一个datetime字段在那里…你在那里。同意。在本例中,这是有保证的,但如果需要,很容易将id字段替换为datetime。您还需要为内部查询中的第二列添加别名:min(id)as id
。非常感谢。我选择了另一个答案,因为那是我最终使用的答案,但我把这个答案投了赞成票。我永远也不会想到那个答案!非常感谢。也为链接测试它。这是一个一流的答案,非常感谢。
select
user,
count(*) as initial_subscriptions
from
(
select companyId, min(id) as id
from the_table
where activity = 'subscribe'
group by companyId
) as fs
inner join the_table on the_table.id = fs.id
group by
user;