sql - 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
我只能想到提取每个数字并遍历整个列表,比较我走的每个日期。但是,此列表非常长,因此不太可行。
提前致谢!
不幸的是,我无权调整涉及这些表的数据库。
解决方案
您需要修复您的数据模型。在一个字符串中存储多个值是错误的。将数字存储在字符串中是错误的。
有时,我们被其他人所困,非常非常糟糕的决定。你可以做你想做的事,但它比必要的更复杂:
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。
推荐阅读
- mysql - MySQL LOAD DATA INFILE 之后不会清除内存
- reactjs - DHX 电子表格 - 无法从 A 列到 D 列进行选择
- python-3.x - 如何将脚本路径转换为 JSON?
- html - 如何根据CSS中第一行div中孩子的高度动态下推第二行div?
- html - 使用 bulma 卡的 CSS 样式
- ruby-on-rails - 接收所有当前用户 ActionCable 连接的最佳方式是什么?
- typescript - 如何在 Vuetify.js 中使用 v-select:发生 404 Not Found
- javascript - 在 JS 上迭代带有空格的数组时出现问题
- python - Python:opencv 视频和函数中的多线程
- javascript - 如何在一个 JavaScript 项目中管理多个音频文件?