Sql 按顺序值选择单个字段
考虑以下两个表:Sql 按顺序值选择单个字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,考虑以下两个表: student_id score date ------------------------- 1 10 05-01-2013 2 100 05-15-2013 2 60 05-01-2012 2 95 05-14-2013 3 15 05-01-2011 3 40 05-01-2012 cl
student_id score date
-------------------------
1 10 05-01-2013
2 100 05-15-2013
2 60 05-01-2012
2 95 05-14-2013
3 15 05-01-2011
3 40 05-01-2012
class_id student_id
----------------------------
1 1
1 2
2 3
我想获得唯一的班级ID,其中至少有一名学生的分数高于某个阈值,按最新分数排序
例如,如果我想得到分数>80的班级列表,我会得到班级id 1,因为学生2的最新分数>80
在t-sql中,我将如何处理这个问题?您是在问这个问题吗
SELECT DISTINCT
t2.[class_ID]
FROM
t1
JOIN t2
ON t2.[student_id] = t1.[student_id]
WHERE
t1.[score] > 80
根据您的日期要求进行编辑,然后您可以使用
row\u number()
获得结果:
select c.class_id
from class_student c
inner join
(
select student_id,
score,
date,
row_number() over(partition by student_id order by date desc) rn
from student_score
) s
on c.student_id = s.student_id
where s.rn = 1
and s.score >80;
看
或者,您可以在存在的地方使用:
select c.class_id
from class_student c
where exists (select 1
from student_score s
where c.student_id = s.student_id
and s.score > 80
and s.[date] = (select max(date)
from student_score s1
where s.student_id = s1.student_id));
请参见这应该可以做到:
SELECT DISTINCT
CS.Class_ID
FROM
dbo.ClassStudent CS
CROSS APPLY (
SELECT TOP 1 *
FROM dbo.StudentScore S
WHERE CS.Student_ID = S.Student_ID
ORDER BY S.Date DESC
) L
WHERE
L.Score > 80
;
还有另一种方法:
WITH LastScore AS (
SELECT TOP 1 WITH TIES
FROM dbo.StudentScore
ORDER BY Row_Number() OVER (PARTITION BY Student_ID ORDER BY Date DESC)
)
SELECT DISTINCT
CS.Class_ID
FROM
dbo.ClassStudent CS
WHERE
EXISTS (
SELECT *
FROM LastScore L
WHERE
CS.Student_ID = L.Student_ID
AND L.Score > 80
)
;
根据数据和索引的不同,这两个查询可能具有非常不同的性能特征。值得尝试几次,看看其中一个是否比其他人更突出
似乎可能存在某个版本的查询,引擎在只找到一个成绩符合要求的学生时就会停止查找,但我现在不确定如何完成该查询。使用选择Distinct
和内部联接
。这只是T-SQL查询的基础。这是一个奇怪的设计。学生成绩的背景是什么?例如,学生2有三个分数,但分数适用于哪个班级?多安:这不是这么简单,因为我需要忽略旧分数。我只需要包含最近日期的分数。托马斯:最上面的表格是一个历史性的表格,用于按日期记录所有得分。下面的表只是一个查找表。请问SQL Server的版本是什么?我需要它也是按日期显示的。因此,在我提供的例子中,如果学生2的最新分数是40,他将不会成为结果的一部分,不管事实上他在某些时候得了80分point@user984444看看蓝脚怪的回答,我理解他们,它满足了你的需求。我认为原来的帖子包含了你理解需求所需的所有信息,特别是关于“因为学生2的最新分数大于80”的部分。第一个查询成功了!非常感谢。这简直快把我逼疯了!
WITH LastScore AS (
SELECT TOP 1 WITH TIES
FROM dbo.StudentScore
ORDER BY Row_Number() OVER (PARTITION BY Student_ID ORDER BY Date DESC)
)
SELECT DISTINCT
CS.Class_ID
FROM
dbo.ClassStudent CS
WHERE
EXISTS (
SELECT *
FROM LastScore L
WHERE
CS.Student_ID = L.Student_ID
AND L.Score > 80
)
;