查询模式的sql

Eri*_*ric 3 t-sql sql-server-2012 pattern-matching

我希望有人能用这个引导我朝着正确的方向前进。我有一张表,上面有学生成绩。

Create Table StudentGrades
( 
  StudentID references Student(StudentID) int not null,
  GradeIssued varchar(1) not null,
  WhenIssued datetime not null default(getdate())
)
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,执行以下操作:查找成绩(按顺序)为 D,然后是 C,然后是另一个 C,然后是 A 的学生。我知道方向(因为成绩的日期发布)模式应该在,但我想不出如何在不使用游标的情况下编写它。

根据我的查询经验,我通过 WHERE 和 HAVING 子句进行过滤,但是当我想找到特定模式时,我不确定该去哪里。

Mar*_*ith 5

一种方法是使用LEAD.

WITH T AS
(
SELECT  StudentID,
        GradeIssued AS g1, 
        LEAD(GradeIssued, 1) OVER (PARTITION BY StudentID ORDER BY WhenIssued) AS g2,
        LEAD(GradeIssued, 2) OVER (PARTITION BY StudentID ORDER BY WhenIssued) AS g3,
        LEAD(GradeIssued, 3) OVER (PARTITION BY StudentID ORDER BY WhenIssued) AS g4
FROM StudentGrades
)
SELECT DISTINCT StudentID
FROM   T
WHERE  g1 = 'D'
       AND g2 = 'C'
       AND g3 = 'C'
       AND g4 = 'A' 
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用XML PATH按顺序连接所有成绩 和LIKE

WITH sg1 AS
(
SELECT DISTINCT StudentID
FROM StudentGrades
)
SELECT *
FROM sg1
CROSS APPLY
(
    SELECT GradeIssued + ''
    FROM StudentGrades sg2
    WHERE sg2.StudentID = sg1.StudentID
    ORDER BY WhenIssued
    FOR XML PATH('')
) CA(grades)
WHERE grades LIKE '%DCCA%'
Run Code Online (Sandbox Code Playgroud)