我有客户端和操作员之间的通信表,其中包含电话,id(1 =客户端,2 =操作员)日期,消息......以及其他一些数据。
我需要制作存储过程,它会像这样排序表
number1 operaters message
number1 clients message
number1 clients message
number1 operaters message
number1 *no message*
.
.
.
所以,从低音开始,我需要找到操作员发送的第一条消息,然后在下一条操作符消息之前找到客户端消息。 如果在一个操作员消息之后没有客户端回答,我需要插入“no clients anwer”等行或类似的行。
那就是大桌子,所以如果步数较少就会很好。
我知道如何通过多列排序,我知道如何找到第一个操作符消息(选择id的最小时间...)但我不知道如何在需要的地方插入这些行。
提前感谢您的帮助。
是的,它是MSSQL。
答案 0 :(得分:1)
实际上没有测试它,但这个一般的想法应该有效:
INSERT INTO YOUR_TABLE(NUMBER, DATE, USER_ID, MESSAGE)
SELECT NUMBER, GETDATE(), 1, '*no message*'
FROM YOUR_TABLE T1
WHERE
USER_ID = 2 -- Operator.
AND NOT EXISTS (
SELECT *
FROM YOUR_TABLE T2
WHERE
T1.NUMBER = T2.NUMBER
AND T1.DATE <= T2.DATE
AND USER_ID = 1 -- Client.
)
简单英语:对于没有较年轻客户端消息的每个运营商消息,请插入新的客户端消息。
(根据您的评论,USER_ID = 1
表示客户和USER_ID = 2
运营商。)
另请注意,使用GETDATE()
假设所有其他日期都是正确的(即未来都不是),这意味着新插入的消息必须比其“父”操作员消息更年轻。如果不能假设,您可能需要在操作员消息的日期使用DATEADD
。