标记排序后连续出现两次的值
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
我的数据由学生信息组成,学生 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