Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实例的SQL查询计数_Sql_Sql Server - Fatal编程技术网

实例的SQL查询计数

实例的SQL查询计数,sql,sql-server,Sql,Sql Server,我有一张表,其中包含公交车和学生注册信息: CREATE TABLE [dbo].[BusSignupInstance]( [Id] [int] IDENTITY(1,1) NOT NULL, [StudentId] [int] NOT NULL, [BusId] [int] NOT NULL ) ON [PRIMARY] 以下是一些示例数据: Id StudentId BusId 1 1 1 2 2 1 3 3 1 4 1 2 5

我有一张表,其中包含公交车和学生注册信息:

CREATE TABLE [dbo].[BusSignupInstance](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [StudentId] [int] NOT NULL,
    [BusId] [int] NOT NULL
) ON [PRIMARY]
以下是一些示例数据:

Id  StudentId   BusId
1   1   1
2   2   1
3   3   1
4   1   2
5   4   2
6   1   3
7   5   3
我希望通过总线ID获得总数。在这种情况下,总数将为:

BusId    Num of Students
1      2 (student id 2, 3)
2      1 (student id 4)
3      2 (student id 1, 5)

结果基于注册顺序,如果学生1注册三次,只有最后一次有效。

@crapycodingguy:你说得对,没有注意到他们可以注册不同的公交车。+1。除了使用这个查询之外,如果我添加了额外的列来维护一个链表(注册序列),这会是一个过度的操作还是一个好的模式更改来简化查询?我们确实需要支持此表的插入和删除(无需更新)。@Icerman:如果不想更新,为什么要有一个链接列表?链表只是简化更新。@Quassnoi,让查询更简单更快(没有子查询)还不够好吗?@Icerman:链表不会让查询更简单更快。它需要一个递归的
CTE
,除了快速重新链接(遍历它很慢)之外,它对任何事情都没有好处。您希望表中有多少不同的学生以及每个学生(平均)注册多少人?数百名学生和约10人的注册人数
SELECT  busId, COUNT(*)
FROM    (
        SELECT  busId, studentId,
                ROW_NUMBER() OVER (PARTITION BY studentId ORDER BY id DESC) rn
        FROM    busSignupInstance
        ) q
WHERE   rn = 1
GROUP BY
        busId