是否可以只对列值的第一个实例执行sql count()?

是否可以只对列值的第一个实例执行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

我想计算每个用户的初始公司订阅数

在下面的数据集中,我希望user1的计数为
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;