首页 > 解决方案 > SQL - 定界+匹配

问题描述

我有一个包含以下列的表:reportid、reportname、startdate、consolidated

合并的报告没有开始日期。

我需要做的是在子报表中找到最早的开始日期并将其设置为开始日期

例如

report  reportname  startdate  consolidated
1       ABC         2019/1/1   1
2       DEF                    3,4
3       GHI         2019/4/1   3
4       JKF         2019/5/1   4

报告可以从任意数量的报告中合并(即报告 10 可能由 11、12、13 组成,而报告 20 可能仅由 21 和 22 组成)

需要输出

report  reportname  startdate  consolidated
1       ABC         2019/1/1   1
2       DEF         2019/4/1   3,4
3       GHI         2019/4/1   3
4       JKF         2019/5/1   4

我只能想到提取每个数字并遍历整个列表,比较我走的每个日期。但是,此列表非常长,因此不太可行。

提前致谢!


不幸的是,我无权调整涉及这些表的数据库。

标签: sqlsql-server

解决方案


您需要修复您的数据模型。在一个字符串中存储多个值是错误的。将数字存储在字符串中是错误的。

有时,我们被其他人所困,非常非常糟糕的决定。你可以做你想做的事,但它比必要的更复杂:

select t.*
from (select t.*, min(startdate) over (partition by s.value) as imputed_startdate,
             row_number() over (partition by report order by report) as seqnum
      from t outer apply
           string_split(t.consolidated, ',') s 
     ) t
where seqnum = 1;

是一个 db<>fiddle。


推荐阅读