如何跟踪sql记录中的最新修改?

罂粟

我有一个表格来跟踪学生的详细信息,还有另一个表格来跟踪学生的表现。

+==========================================+
| ID      |  Department     | Date         |
+==========================================+
| 001     | English         | Jan 3 2017   |
| 001     | English         | Feb 24 2017  |
| 001     | Science         | Mar 1 2017   |
| 001     | Maths           | Mar 2 2017   |
| 001     | Maths           | Mar 21 2017  |
| 001     | Maths           | Apr 2 2017   |
| 001     | English         | Apr 7 2017   |
| 002     | Maths           | Feb 1 2017   |
| 002     | Maths           | Apr 7 2017   |
| 003     | Maths           | Apr 3 2017   |
| 003     | Maths           | Apr 7 2017   |
| 004     | Science         | Feb 1 2017   |
| 004     | Science         | Mar 1 2017   |
| 004     | Maths           | Apr 7 2017   |
| 004     | English         | Apr 9 2017   |
+==========================================+

性能表:

+===========================================================================+
| ID      |  Department         | Best score|  Avg score    |   Date        |
+===========================================================================+
| 001     | English             |   98      |   85          | Jan 30 2017   |
| 001     | English             |   89      |   80.2        | Apr 14 2017   |
| 001     | Science             |   75      |   79.8        | May 1 2017    |
| 001     | Maths               |   88      |   80.2        | Jan 12 2017   |
| 001     | Maths               |   79      |   75.6        | Feb 21 2017   |
| 001     | Maths               |   90      |   80.5        | Jan 20 2017   |
| 001     | English             |   80      |   79.3        | Mar 27 2017   |
| 002     | Maths               |   90      |   78.4        | Mar 31 2017   |
| 002     | Maths               |   85      |   80.2        | May 7 2017    |
| 003     | Maths               |   75      |   79.1        | Apr 30 2017   |
| 003     | Maths               |   80      |   80.0        | Feb 7 2017    |
| 004     | Science             |   60      |   70.3        | May 1 2017    |
| 004     | Science             |   72      |   69.9        | Mar 10 2017   |
| 004     | Maths               |   70      |   66.8        | Jan 17 2017   |
| 004     | English             |   65      |   65.0        | Mar 29 2017   |
+===========================================================================+

每当学生表中发生部门变化时,我想获得学生的最新表现和平均分数。考虑到学生 001,学生部门的变化是

| 001     | English         | Jan 3 2017   |
| 001     | Science         | Mar 1 2017   |
| 001     | Maths           | Apr 2 2017   |

对于 2017 年 1 月 3 日,没有比 Performance 表中的日期晚的日期。

2017 年 3 月 1 日,性能表中的最新记录日期为 2017 年 2 月 21 日

2017 年 4 月 2 日,性能表中的最近记录日期为 2017 年 3 月 27 日

请帮我做这件事。

库马尔·哈什

如果我的脚本有误,请稍微解释清楚

希望你解释的输出是正确的。因为我对输出有疑问。

最重要的是希望您发布了完全相同的表结构。

由于您的表结构,使用了比预期更多的窗口函数,这可能会影响您的性能。

关于您的真实需求以及表结构应该是什么以及应该如何填充,这是非常不同和重要的讨论。

用各种示例数据试试这个脚本,让我知道,

declare @StudentDetails table(ID varchar(20)
,Department varchar(20),Dates Date)
insert into @StudentDetails VALUES
('001','English','Jan 3 2017 ') 
,('001','English','Feb 24 2017') 
,('001','Science','Mar 1 2017 ') 
,('001','Maths','Mar 2 2017 ') 
,('001','Maths','Mar 21 2017') 
,('001','Maths','Apr 2 2017 ') 
,('001','English','Apr 7 2017 ') 
,('002','Maths','Feb 1 2017 ') 
,('002','Maths','Apr 7 2017 ') 
,('003','Maths','Apr 3 2017 ') 
,('003','Maths','Apr 7 2017 ') 
,('004','Science','Feb 1 2017 ') 
,('004','Science','Mar 1 2017 ') 
,('004','Maths','Apr 7 2017 ') 
,('004','English','Apr 9 2017 ') 
--select * from @StudentDetails

declare @Performance table( ID varchar(20)
,Department varchar(20),Bestscore float,Avgscore float,PDate date)

insert into @Performance VALUES
 ('001','English',98,85    ,'Jan 30 2017')
,('001','English',89,80.2  ,'Apr 14 2017')
,('001','Science',75,79.8  ,'May 1 2017 ')
,('001','Maths',88,80.2  ,'Jan 12 2017')
,('001','Maths',79,75.6  ,'Feb 21 2017')
,('001','Maths',90,80.5  ,'Jan 20 2017')
,('001','English',80,79.3  ,'Mar 27 2017')
,('002','Maths',90,78.4  ,'Mar 31 2017')
,('002','Maths',85,80.2  ,'May 7 2017 ')
,('003','Maths',75,79.1  ,'Apr 30 2017')
,('003','Maths',80,80.0  ,'Feb 7 2017 ')
,('004','Science',60,70.3  ,'May 1 2017 ')
,('004','Science',72,69.9  ,'Mar 10 2017')
,('004','Maths',70,66.8  ,'Jan 17 2017')
,('004','English',65,65.0  ,'Mar 29 2017')
--select * from @Performance
--declare @SID  varchar(20)='001'

;with CTE as
(
select *
,ROW_NUMBER()over(partition by id order by Dates,Department) rn
from @StudentDetails
--where id=@SID
)
,CTE3 AS(
select c.id, c.Department,c.dates,c.rn,1 rn3
from cte c
where rn=1

union ALL

select c.id, c.Department,c.dates,c.rn
,case when c.Department=c3.Department  and c.dates>c3.dates 
then cast(c3.rn3 as int)
else cast(c3.rn3+1 as int) end
from cte c
inner join cte3 c3
on c.id=c3.id
where c.rn=c3.rn+1
and c.rn<=7
)
,cte4 AS(
select *,0 rn1 from cte3 where rn=1
union ALL
select * from 
(
select * ,ROW_NUMBER()over(PARTITION by id,rn3 order by dates desc) rn1
from cte3
where rn3>1
)t4 where t4.rn1=1
)

select c.id,c.department,c.dates,fn.Avgscore AVGScroe,fn.pdate RecentPDate 
from cte4 c
OUTER apply(
select * from
(select p.*,ROW_NUMBER()over( order by pdate desc)rn2 
from @Performance P
where c.id=p.id and p.pDate<c.dates)t4
where rn2=1 )fn
order by c.id

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在SQL中获取最新的更新记录?

来自分类Dev

如何通过sql中的最新日期获取用户名的最新记录

来自分类Dev

从表中获取最新记录日期,SQL

来自分类Dev

如何提取表中添加的最新记录?

来自分类Dev

如何在PostgreSQL中获取最新记录?

来自分类Dev

SQL:选择多个记录时如何只选择最新记录

来自分类Dev

如何跟踪在DOM中修改div的内联样式的JavaScript?

来自分类Dev

如何跟踪在DOM中修改div的内联样式的JavaScript?

来自分类Dev

如何使用SQl语法从MySQL表中的组中选择最新记录

来自分类Dev

如何使用联接在SQL Server中基于时间戳获取最新记录

来自分类Dev

我如何获取mongodb中每组记录的最新记录

来自分类Dev

可以跟踪谁删除了SQL表中的记录?

来自分类Dev

可以跟踪谁删除了SQL表中的记录?

来自分类Dev

SQL跟踪器记录表中的更改

来自分类Dev

SQL选择最新记录

来自分类Dev

Access SQL-如何获取最新记录和时间戳之前的最新记录?

来自分类Dev

如何:如何使用SQL SELECT JOIN提取最新记录

来自分类Dev

如何使用 Sqlline 在 Apache Calcite 中启用日志记录/跟踪?

来自分类Dev

如何使用Cakephp在目录中获取最新的修改文件

来自分类Dev

如何使用最新记录更新SQL Server表

来自分类Dev

SQL-如何获取每个帐户的最新记录

来自分类Dev

如何获取我的SQL查询以删除最新记录?

来自分类Dev

SQL查询:如何选择记录,但是如果存在父记录,则选择它的最新子记录

来自分类Dev

SQL从一组数据中获取最新记录

来自分类Dev

获取SQL Server中多个项目的最新记录

来自分类Dev

获取SQL Server中多个项目的最新记录

来自分类Dev

SQL从一组数据中获取最新记录

来自分类Dev

分组和排序结果以选择MS SQL中的最新记录

来自分类Dev

如何记录完整的堆栈跟踪?

Related 相关文章

  1. 1

    如何在SQL中获取最新的更新记录?

  2. 2

    如何通过sql中的最新日期获取用户名的最新记录

  3. 3

    从表中获取最新记录日期,SQL

  4. 4

    如何提取表中添加的最新记录?

  5. 5

    如何在PostgreSQL中获取最新记录?

  6. 6

    SQL:选择多个记录时如何只选择最新记录

  7. 7

    如何跟踪在DOM中修改div的内联样式的JavaScript?

  8. 8

    如何跟踪在DOM中修改div的内联样式的JavaScript?

  9. 9

    如何使用SQl语法从MySQL表中的组中选择最新记录

  10. 10

    如何使用联接在SQL Server中基于时间戳获取最新记录

  11. 11

    我如何获取mongodb中每组记录的最新记录

  12. 12

    可以跟踪谁删除了SQL表中的记录?

  13. 13

    可以跟踪谁删除了SQL表中的记录?

  14. 14

    SQL跟踪器记录表中的更改

  15. 15

    SQL选择最新记录

  16. 16

    Access SQL-如何获取最新记录和时间戳之前的最新记录?

  17. 17

    如何:如何使用SQL SELECT JOIN提取最新记录

  18. 18

    如何使用 Sqlline 在 Apache Calcite 中启用日志记录/跟踪?

  19. 19

    如何使用Cakephp在目录中获取最新的修改文件

  20. 20

    如何使用最新记录更新SQL Server表

  21. 21

    SQL-如何获取每个帐户的最新记录

  22. 22

    如何获取我的SQL查询以删除最新记录?

  23. 23

    SQL查询:如何选择记录,但是如果存在父记录,则选择它的最新子记录

  24. 24

    SQL从一组数据中获取最新记录

  25. 25

    获取SQL Server中多个项目的最新记录

  26. 26

    获取SQL Server中多个项目的最新记录

  27. 27

    SQL从一组数据中获取最新记录

  28. 28

    分组和排序结果以选择MS SQL中的最新记录

  29. 29

    如何记录完整的堆栈跟踪?

热门标签

归档