实例的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