【问题标题】:Keep NULL when Rows Corresponds to MAX in Other Column当 Rows 对应于其他列中的 MAX 时保持 NULL
【发布时间】:2021-09-05 14:36:50
【问题描述】:

我在 SQL Server 中有 GROUP BY / MAX(.) 的情况。请考虑下表Tab1,其中包含每年重复的课程条目:

studentName Course startDate finishDate
N1 C1 2020-01-01 NULL
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 NULL
N2 C1 2018-01-01 2018-02-01
N2 C2 2020-01-01 NULL
N2 C2 2019-01-01 2019-02-01
N2 C2 2018-01-01 2018-02-01

NULL 表示学生没有完成课程。我想访问每门课程中每个学生的最新尝试。的输出

SELECT studentName, Course, MAX(startDate), MAX(finishDate)
FROM Tab1
GROUP BY studentName, Course

是:

studentName Course startDate finishDate
N1 C1 2020-01-01 2019-02-01
N2 C1 2020-01-01 2020-02-01
N2 C2 2020-01-01 2019-02-01

这不是正确的输出,因为N1 <-> C1N2 <-> C2 组合应该有NULL。如何在保留NULL 的同时保留MAX(finishDate)

谢谢。

【问题讨论】:

  • 从你的样本数据中不是很清楚你想要什么输出。你能显示,形成你的样本数据,输出应该是什么?对于 N2 C1 的组合,它是否算作完成,因为有更高的开始日期和结束日期,还是应该报告 NULL?
  • @DaleK 完成!谢谢提醒。
  • 这能回答你的问题吗? Get top 1 row of each group
  • @Charlieface 我认为我的问题有所不同。在群组中使用MAX(.) 时,我有兴趣保留NULL
  • 完全没有区别。这就是“每组前 1 名”的意思,每组获得第一行。那里的最佳答案使用row_number(),就像这里的答案一样

标签: sql sql-server tsql group-by max


【解决方案1】:

假设您想要每个学生和课程组合的最新开始日期的记录 - 一种方法是使用 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

【讨论】:

  • 完美!谢谢。
【解决方案2】:

通过按学生姓名和课程分组的 max(startdate) 获取最后开始日期。然后再次自行加入表,得到对应的完成日期。

select a.studentName
     , a.course
     , a.last_start_date as start_date
     , b.finishdate
  from (
select studentName
     , course
     , max(startdate) last_start_date
  from Tab1
 group by studentName, course) a, Tab1 b
 where a.studentName = b.studentName
   and a.course = b.course
   and a.last_start_date = b.startdate;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2023-03-17
    • 2022-01-11
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多