值更改后如何创建新的顺序标志(在SQL中)

我试图在部分更改时创建一个顺序数字标志。

当学生加入某个部分时,标记应为1,并在该部分更改之前继续为1。第一次更改的标志应为2,第二次更改的标志应为3,依此类推。

由于更改后某个部分可以重复,因此我发现要创建所需的结果具有挑战性。

任何帮助将不胜感激。

样本数据

create table dbo.cluster_test
(student_id int not null
,record_date date not null
,section varchar(30) null)

insert into cluster_test
(student_id, record_date, section)
values
 (123, '2020-02-06', NULL)
,(123, '2020-05-14', 'A')
,(123, '2020-08-12', 'A')
,(123, '2020-09-01', 'B')
,(123, '2020-09-15', 'A')
,(123, '2020-09-29', 'A')
,(123, '2020-11-02', NULL)
,(123, '2020-11-30', NULL)
,(789, '2020-01-12', NULL)
,(789, '2020-04-12', 'A')
,(789, '2020-05-03', NULL)
,(789, '2020-06-13', 'A')
,(789, '2020-06-30', 'B')
,(789, '2020-07-01', 'B')
,(789, '2020-07-22', 'A')

所需结果

学生卡 记录日期 部分
123 2020-02-06 空值 空值
123 2020-05-14 一种 1个
123 2020-08-12 一种 1个
123 2020-09-01 2
123 2020-09-15 一种 3
123 2020-09-29 一种 3
123 2020-11-02 空值 空值
123 2020-11-30 空值 空值
789 2020-01-12 空值 空值
789 2020-04-12 一种 1个
789 2020-05-03 空值 空值
789 2020-06-13 一种 2
789 2020-06-30 3
789 2020-07-01 3
789 2020-07-22 一种 4

尝试:

select
 student_id
,record_date
,section
,case when section is not null then row_number() over(partition by student_id, section order by record_date asc)
 end row#
,case when (section is not null) and (lag(section, 1) over(partition by student_id order by record_date asc) is null) then 'start'
      when (lag(section, 1) over(partition by student_id order by record_date asc) is not null) and (section != lag(section, 1) over(partition by student_id order by record_date asc)) then 'change'
 end chk_txt
,case when section is not null then (case when (section is not null) and (lag(section, 1) over(partition by student_id order by record_date asc) is null) then 1
                                          when (lag(section, 1) over(partition by student_id order by record_date asc) is not null) and (section != lag(section, 1) over(partition by student_id order by record_date asc)) then 1
                                          else 0
                                     end)
 end chk_val2
from cluster_test

order by 1, 2
大力水手

是差距和孤岛问题。您可以按如下方式使用分析功能:

Select student_id, record_date, section,
    Case when section is not null 
        Then sum(case when section is not null and (section <> lgs or lgs is null) then 1 end) 
            over (partition by student_id order by record_date)
    End as flag
From (
    Select student_id, record_date, section,
        Lag(section) over (partition by student_id order by record_date) as lgs
    From cluster_test t
) t
order by student_id, record_date;

db <>小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

列值更改时,如何在SQL Server 2012中的顺序记录中添加组号?

sqlalchemy中的值更改后如何触发事件

如何在 Ubuntu 中创建新的命令行标志

更改列表中数字的顺序而无需创建新的数字

如何使用 SQL 脚本中的新值更新 XML 元素

创建后,如何将Ruby哈希默认值更改为任意对象?

每当列值更改时,如何使用“ dplyr”创建一个新组?

创建一个新变量来标记R中绝对值更改的每个实例

如何更改流程创建的顺序?

在React Native中如何在TextInput中更改默认值并用新值更新

如何在 Ruby on Rails 中创建表或更改迁移顺序?

使用新值更新验证后,如何重置表单中的输入字段失败

Angular 7:在ts文件更改后如何保持html中的变量值更新

在android中按下按钮后如何将值更改为“活动”?

如何在SWT中创建基于另一个CCombo值更改的CCombo?

如何检查列中的值更改

SQL显示每列值更改后的摘要

如何更改SQL行顺序

用新的外键值更改sql表

如何在Xapian中更改功能标志

Quasar/Vue 计算值更改后如何调用函数

Kendo UI 数据网格:如何根据状态标志整数值更改列显示值

从对话框中输入后如何创建新卡

在 Django 模型中执行算术运算后,如何使用获得的新值更新模型中整数的值?

BLOC中的流值更改时导航到新屏幕

在Python中创建类对象属性后,如何更改它们?

在plotly中创建后如何更改子图标题?

在Rails中创建后如何更改路径的位置?

对 Map 进行排序并在值更改时重新分配新顺序的算法