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

SQL如何查询同ID最小最大日期及对应分类生成单行记录存入新表

解法

你可以通过分组聚合加关联查询,或者窗口函数实现需求,两种常用方案如下:

方案1:通用SQL写法(兼容所有主流数据库)

先分别计算每个ID的最小入院日期、最大出院日期,再分别关联原表拿到对应的分类值:

SELECT 
    t_base.ID,
    t_base.MinAdmissionDate,
    t_base.MaxDischargeDate,
    t_adm.Category AS AdmittedCategory,
    t_dis.Category AS DischargeCategory
FROM (
    -- 先聚合得到每个ID的最小入院、最大出院日期
    SELECT 
        ID,
        MIN(AdmissionDate) AS MinAdmissionDate,
        MAX(DischargeDate) AS MaxDischargeDate
    FROM 你的表名
    GROUP BY ID
) t_base
-- 关联拿到最小入院日期对应的分类
LEFT JOIN 你的表名 t_adm 
    ON t_base.ID = t_adm.ID 
    AND t_base.MinAdmissionDate = t_adm.AdmissionDate
-- 关联拿到最大出院日期对应的分类
LEFT JOIN 你的表名 t_dis 
    ON t_base.ID = t_dis.ID 
    AND t_base.MaxDischargeDate = t_dis.DischargeDate

如果存在同一个ID下多条记录入院日期都是最小值的情况,你可以根据业务需求加额外的去重逻辑即可。

方案2:窗口函数写法(支持窗口函数的数据库,比如MySQL8.0+、PostgreSQL、SQL Server等)

用排序窗口函数给同ID下的记录按入院日期升序、出院日期降序打标,再取对应行的字段即可:

SELECT 
    ID,
    MAX(CASE WHEN rn_adm = 1 THEN AdmissionDate END) AS MinAdmissionDate,
    MAX(CASE WHEN rn_dis = 1 THEN DischargeDate END) AS MaxDischargeDate,
    MAX(CASE WHEN rn_adm = 1 THEN Category END) AS AdmittedCategory,
    MAX(CASE WHEN rn_dis = 1 THEN Category END) AS DischargeCategory
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY AdmissionDate ASC) AS rn_adm,
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY DischargeDate DESC) AS rn_dis
    FROM 你的表名
) t
GROUP BY ID

如果要处理同日期多记录的场景,把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可,按需调整。

内容的提问来源于stack exchange,提问作者DON_DON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:24:00