SQL Server 2008.在结果中排​​序和插入自定义行

时间:2011-10-27 10:32:34

标签: sql sql-server sql-server-2008 stored-procedures

我有客户端和操作员之间的通信表,其中包含电话,id(1 =客户端,2 =操作员)日期,消息......以及其他一些数据。

我需要制作存储过程,它会像这样排序表

number1 operaters message
number1 clients message
number1 clients message
number1 operaters message
number1 *no message*
.
.
.

所以,从低音开始,我需要找到操作员发送的第一条消息,然后在下一条操作符消息之前找到客户端消息。 如果在一个操作员消息之后没有客户端回答,我需要插入“no clients anwer”等行或类似的行。

那就是大桌子,所以如果步数较少就会很好。

我知道如何通过多列排序,我知道如何找到第一个操作符消息(选择id的最小时间...)但我不知道如何在需要的地方插入这些行。

提前感谢您的帮助。

是的,它是MSSQL。

1 个答案:

答案 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