SQL Server 2008. сортировать и вставлять пользовательские строки в результат - PullRequest
0 голосов
/ 27 октября 2011

У меня есть таблица для связи между клиентами и операторами, которая содержит телефон, идентификатор (1 = клиент, 2 = оператор), дату, сообщение ... и некоторые другие данные.

Мне нужно сделать хранимую процедурукоторый будет сортировать таблицу следующим образом:

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

Итак, в общем, мне нужно найти первое сообщение, отправленное оператором, а затем клиентские сообщения перед следующим сообщением оператора.Если после одного сообщения оператора нет ответа клиента, мне нужно вставить строку типа «нет клиентов и т. Д.» Или что-то в этом роде.

И это большая таблица, поэтому будет хорошо, если будет меньше шагов.

Я знаю, как упорядочить по нескольким столбцам, я знаю, как найти первое сообщение оператора (выберите min time, где id ...), но я не знаю, как вставить эти строки, где это необходимо.

Заранее спасибо за помощь.

И да, это MSSQL.

1 Ответ

1 голос
/ 27 октября 2011

На самом деле это не проверялось, но эта общая идея должна работать:

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 для ДАТЫ сообщения оператора.

...