【发布时间】:2021-10-28 02:02:25
【问题描述】:
我正在使用一个相当糟糕的数据源,包含我需要的信息的列位于 varchar(max) 内并被分隔。但是,数据可以跨多行重复,因此我正在尝试删除这些重复项。
这可以通过修剪我感兴趣的列来完成,因为当我重复发生时,“ID”会重新附加到列的末尾。然后我将其区别对待,然后将结果连接起来;不漂亮。
示例数据和我目前使用的查询SQL Fiddle
数据表
| id | callID | callDateTime | history |
|----|--------|-----------------------------|-------------------------------------|
| 1 | 1 | 2021-01-01 10:00:00.0000000 | Amount: 10, Ref:123, ID:123 |
| 2 | 1 | 2021-01-01 10:01:00.0000000 | Amount: 10, Ref:123, ID:123, ID:123 |
| 3 | 2 | 2021-01-01 11:00:00.0000000 | Amount:12.44, Ref:SIS, ID:124 |
| 4 | 2 | 2021-01-01 11:02:00.0000000 | Amount:11.22, Ref:Dad, ID:124 |
| 5 | 2 | 2021-01-01 11:01:00.0000000 | Amount:11.22, Ref:Mum, ID:124 |
| 6 | 3 | 2021-01-01 12:00:00.0000000 | Amount:11, ID:125 |
查询
select CallID, Concat([1],',', [2],',',[3])
from
(
select CallID, historyEdit, ROW_NUMBER() over (partition by callID order by callID) as rowNum
from
(
select distinct callID,
substring(history, 0, charindex(', ID:',history)) historyEdit
from test
) a
)b
PIVOT(max(historyEdit) for rowNum IN ([1],[2],[3])) piv
结果
| CallID | |
|--------|-------------------------------------------------------------------|
| 1 | Amount: 10, Ref:123,, |
| 2 | Amount:11.22, Ref:Dad,Amount:11.22, Ref:Mum,Amount:12.44, Ref:SIS |
| 3 | Amount:11,, |
问题是我需要确保连接部分按照事件发生的顺序执行。在上面您会看到 CallID 2 的顺序错误,因为信息 3 在信息 2 之前出现,我确实尝试先按 callDateTime 对基表进行排序,然后运行查询,但它似乎确实产生了一些随机结果。有时它会以正确的顺序排列,有时则不会。我认为这是因为我没有在查询中指定任何 order by 子句。
在结果中包含 callDateTime 会导致 distinct 不返回 unqiue 数据行,因为 callDateTime 对于该重复的数据行仍然是唯一的
我正在使用 SQL Server v12
期望的结果
| CallID | |
|--------|-------------------------------------------------------------------|
| 1 | Amount: 10, Ref:123,, |
| 2 | Amount:12.44, Ref:SiS,Amount:11.22, Ref:Mum,Amount:11.22, Ref:Dad |
| 3 | Amount:11,, |
【问题讨论】:
-
您能更清楚地了解您要完成的工作吗?您要删除什么重复数据?
标签: sql sql-server tsql sql-server-2012