如何通过单SQL查询获取各typeid的最早与最晚入职日期
解决方案
方法一:基于行号字段的条件聚合
假设你已经通过窗口函数生成了sno(按joining_date升序分区排序的行号)和slno(按joining_date降序分区排序的行号),可以通过条件聚合直接提取每个typeid对应的目标日期:
SELECT typeid, MAX(CASE WHEN sno = 1 THEN joining_date END) AS date_1, MAX(CASE WHEN slno = 1 THEN joining_date END) AS date_2 FROM ( -- 这里是你生成sno和slno的原查询 SELECT typeid, joining_date, ROW_NUMBER() OVER (PARTITION BY typeid ORDER BY joining_date ASC) AS sno, ROW_NUMBER() OVER (PARTITION BY typeid ORDER BY joining_date DESC) AS slno FROM employee ) AS ranked_employees GROUP BY typeid;
逻辑说明:
- 子查询部分:按
typeid分组,对每组的joining_date分别做升序、降序排序,生成行号sno和slno。 - 外层查询:用
CASE语句筛选出每组中行号为1的入职日期,再通过MAX聚合(每组仅一个符合条件的值,MIN也可)得到每个typeid对应的date_1(最早入职日期)和date_2(最晚入职日期)。
方法二:直接用窗口函数提取最值(更高效)
如果不需要保留sno和slno字段,可以跳过行号生成步骤,用FIRST_VALUE窗口函数直接获取目标值:
SELECT DISTINCT typeid, FIRST_VALUE(joining_date) OVER (PARTITION BY typeid ORDER BY joining_date ASC) AS date_1, FIRST_VALUE(joining_date) OVER (PARTITION BY typeid ORDER BY joining_date DESC) AS date_2 FROM employee;
逻辑说明:
FIRST_VALUE会返回每个分区内排序后的第一个值,这里分别按升序、降序取每组的首个joining_date,即对应最早和最晚入职日期。- 用
DISTINCT去重,确保每个typeid仅返回一行结果。
内容的提问来源于stack exchange,提问作者codeanonym
相关产品推荐
相关产品推荐

