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
   )
;