sql - 当 Rows 对应于其他列中的 MAX 时保持 NULL
问题描述
我在 SQL Server 中有GROUP BY
/的情况。MAX(.)
请考虑下表,Tab1
以及每年重复的课程条目:
学生姓名 | 课程 | 开始日期 | 完成日期 |
---|---|---|---|
N1 | C1 | 2020-01-01 | 无效的 |
N1 | C1 | 2019-01-01 | 2019-02-01 |
N1 | C1 | 2018-01-01 | 2018-02-01 |
N2 | C1 | 2020-01-01 | 2020-02-01 |
N2 | C1 | 2019-01-01 | 无效的 |
N2 | C1 | 2018-01-01 | 2018-02-01 |
N2 | C2 | 2020-01-01 | 无效的 |
N2 | C2 | 2019-01-01 | 2019-02-01 |
N2 | C2 | 2018-01-01 | 2018-02-01 |
ANULL
表示学生没有完成课程。我想访问每门课程中每个学生的最新尝试。的输出
SELECT studentName, Course, MAX(startDate), MAX(finishDate)
FROM Tab1
GROUP BY studentName, Course
是:
学生姓名 | 课程 | 开始日期 | 完成日期 |
---|---|---|---|
N1 | C1 | 2020-01-01 | 2019-02-01 |
N2 | C1 | 2020-01-01 | 2020-02-01 |
N2 | C2 | 2020-01-01 | 2019-02-01 |
这不是正确的输出,因为应该有NULL
forN1 <-> C1
和N2 <-> C2
组合。我怎样才能MAX(finishDate)
在保留的同时采取NULL
?
谢谢你。
解决方案
假设您想要每个学生和课程组合的最新开始日期的记录 - 一种方法是使用 row_number 函数。
像这样的东西:
;with student_select as (
SELECT
studentName
, Course
, startDate
,finishDate
,row_number() over (partition by studentName,Course order by startdate desc) as row_num
FROM Tab1
)
Select
studentName
, Course
, startDate
,finishDate
from student_select
where row_num = 1
在此处查看 SQL FIDDLE 示例:-http://www.sqlfiddle.com/#!18/9ad7f / 3
推荐阅读
- c++ - 为什么输入流不能识别 Ctrl D 而是给出一个无限循环?
- xml - 如何从 xquery 中的 xml 文件返回属性?
- google-compute-engine - 来自 GCP 虚拟机的出口数据
- python - 子进程找不到我的文件(找不到文件错误)
- android - 在颤振中使用.where后如何获取子集合
- windows - 为什么 Windows 推迟为数据文件创建 PPTE?
- c - 比较阵列与二维阵列 - 微控制器的莫尔斯电码
- python - 如果始终以相同的名称保存,多个客户端可以同时下载动态创建的文件吗?
- reactjs - React Redux 使用许多智能容器和结构化组件
- android - Gradle 构建在启用与多模块的数据绑定时失败