标记排序后连续出现两次的值

Flag a value that occurs twice in a row after ordering

我的数据由学生信息组成,学生 GPA 类别由两个类别组成('GPA < 2.5';'GPA OK'),以及与 GPA 相关的术语。我想创建一个标志列,为 GPA 类别等于 'GPA OK' 的行的标志分配一个静态值 (0),当 GPA 类别等于 'GPA < 2.5' (1)、 时,另一个值以及 'GPA < 2.5' 在按学生和学期 (2) 对数据排序后连续出现两次时的另一个值。请参阅下面我想要完成的示例:

Student        Term       GPA Category    FLAG
StudentA    Fall   2021     GPA OK         0 -- Flag for when GPA OK occurs
StudentA    Spring 2022     GPA < 2.5      1 -- Flag for when GPA < 2.5 occurs
StudentA    Summer 2022     GPA < 2.5      2 -- Flag for when GPA < 2.5 occurs at least twice in a row
StudentB    Fall   2021     GPA < 2.5      1
StudentB    Summer 2021     GPA < 2.5      2
StudentB    Fall   2021     GPA < 2.5      2
StudentC    Fall   2021     GPA < 2.5      1
StudentC    Summer 2022     GPA < 2.5      2
StudentC    Fall   2022     GPA OK         0
StudentC    Spring 2023     GPA < 2.5      1
StudentC    Summer 2023     GPA OK         0
StudnetC    Fall   2023     GPA OK         0

如果相关,Student、Term 和 GPA Category 字段是我在 Select 语句中分别使用 CONCAT、iif 和 CASE 函数计算的字段。 有人可以帮我吗?这个让我难住了。

您可以使用 LAG,我假设您有一个 RowNumber 或者可以生成一个 RowNumber 以按所需的顺序保存这些记录。我还建议将您现有的 SELECT 语句移动到 CTE,因为您注意到 Student 和 GPA_Category 都是计算出来的,这样您就可以在最终的 SELECT 中将它们称为值。


    DECLARE @t1 TABLE (RowN INT, Student VARCHAR(50), Term VARCHAR(20), [GPA_Category] VARCHAR(20))
    
    INSERT INTO @t1
    VALUES
    (1,'StudentA',    'Fall   2021',     'GPA OK'),         
    (2,'StudentA',    'Spring 2022',     'GPA < 2.5'),    
    (3,'StudentA',    'Summer 2022',     'GPA < 2.5'),     
    (4,'StudentB',    'Fall   2021',     'GPA < 2.5'),    
    (5,'StudentB',    'Summer 2021',     'GPA < 2.5'),      
    (6,'StudentB',    'Fall   2021',     'GPA < 2.5'),      
    (7,'StudentC',    'Fall   2021',     'GPA < 2.5'),      
    (8,'StudentC',    'Summer 2022',     'GPA < 2.5'),      
    (9,'StudentC',    'Fall   2022',     'GPA OK'),      
    (10,'StudentC',    'Spring 2023',     'GPA < 2.5'),      
    (11,'StudentC',    'Summer 2023',     'GPA OK'),      
    (12,'StudentC',    'Fall   2023',     'GPA OK')
    
    SELECT *,
    CASE WHEN LAG(Student, 1) OVER (ORDER BY RowN) = Student 
             AND LAG(GPA_Category,1) OVER (ORDER BY RowN) LIKE 'GPA < 2.5'
             AND GPA_Category LIKE 'GPA < 2.5' THEN 2
          WHEN GPA_Category LIKE 'GPA < 2.5' THEN 1
          WHEN GPA_Category LIKE 'GPA OK' THEN 0 END AS Flag
    FROM @t1 t