You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:21:23