【发布时间】:2015-07-14 14:03:33
【问题描述】:
我有发送给我的数据,我需要对其进行规范化。数据在一个sql表中,但每一行都有多个多值列。一个例子如下:
ID fname lname projects projdates
1 John Doe projA;projB;projC 20150701;20150801;20150901
2 Jane Smith projD;;projC 20150701;;20150902
3 Lisa Anderson projB;projC 20150801;20150903
4 Nancy Johnson projB;projC;projE 20150601;20150822;20150904
5 Chris Edwards projA 20150905
需要也是这样的:
ID fname lname projects projdates
1 John Doe projA 20150701
1 John Doe projB 20150801
1 John Doe projC 20150901
2 Jane Smith projD 20150701
2 Jane Smith projC 20150902
3 Lisa Anderson projB 20150801
3 Lisa Anderson projC 20150903
4 Nancy Johnson projB 20150601
4 Nancy Johnson projC 20150822
4 Nancy Johnson projE 20150904
5 Chris Edwards projA 20150905
我需要将其拆分为 id、fname、lname 的行,并将项目和 proddates 解析为单独的记录。我发现许多带有拆分功能的帖子,我可以让它为 1 列工作,但不是 2。当我做 2 列时,它会渗透到拆分中。即对于 John Doe,它给了我 3 次 projA 的记录,每个 proddates 一次。我需要将每个多值项目记录与其各自的 projdate 而非其他项目记录进行 coorelate。
有什么想法吗?
谢谢!
【问题讨论】:
-
请发布您的预期结果集
-
虽然这不是存储数据(非规范化)的好方法,但由于这是其他人发送给您的,您可能没有选择。如果您确实可以选择使其正常化,请这样做或说服对方。对于目前的担忧,您能分享一下您到目前为止所做的尝试吗?
-
当项目和项目日期计数不匹配时会发生什么?例如有 4 个项目,但有 5 个项目编号。即使它们始终相等,您是否假设一个列表中的第一个元素始终对应于第二个列表中的第一个元素?
-
我这辈子都无法理解为什么人们会对某个问题投反对票。我有个问题!为什么要做一个粗鲁的混蛋?我到处寻找,只能找到拆分一列的解决方案,而不是 2 个或更多相关列。我想要做的是规范化数据。该数据大约有 30 列,并且它们的组相互关联,前几列是单个记录数据。我将在编辑中发布我希望结果看起来像的表格。我可以说相互关联的列总是匹配的。无论如何,它们的分隔符。
-
嗯,一个更好的问题将包括预期结果,并讨论边缘情况 - 例如我们可以看到 ID 2 似乎有一个跳过的值 -
;;应该会产生结果吗?此外,这里的其他 cmets 建议考虑其他边缘情况(如果项目是ABC;DEF和 projdates 是20150101;20150201;20150301,我们该怎么办)
标签: sql parsing split multivalue