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
相关产品推荐
相关产品推荐

