Сортировать несколько наборов данных в один набор данных - PullRequest
1 голос
/ 03 февраля 2012

Я задавал тот же вопрос несколько дней назад, но там я хотел решить свою проблему с помощью отдельной программы на C #. Теперь я хочу сделать это в SQL напрямую.

Это моя проблема (Извините, что связал вас с другим вопросом)

Моими первыми попытками было создать этот триггер:

CREATE TRIGGER myNewTrigger ON [dbo].[myTable]
FOR INSERT
AS

INSERT INTO dbo.myTargetTable
        (TIMESTAMP, VALUE_1, VALUE_2, VALUE_3, VALUE_4)
    SELECT
        DATEADD(SECOND, TIMESTAMP_S,'19700101'), VALUE, VALUE, VALUE, VALUE
        FROM inserted

GO

Это создаст четыре строки с одинаковыми четырьмя значениями. Но как я могу поместить значения каждой строки в один ряд с разными столбцами?

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Это непроверенное предложение выбора может быть вашим решением, если не будет проблемы с триггером.

Первая проблема:

Триггер срабатывает после каждой вставки в mytable.После первой вставки метки времени остается только одно значение.Так что нужно обновлять после третьей или четвертой записи.Вы делаете вставку для последней, а не для текущей отметки времени.Эта проблема не решена в моем решении.

Вторая проблема:

Вы должны убедиться, что вы вставляете только один раз, а не после каждой строки.Вы можете добавить NOT IN-Clause в оператор выбора для вставки.Эта проблема не решена в моем решении.

SELECT 
DISTINCT
TS
,(SELECT VALUE FROM
    (SELECT MT.TS, MT.VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable MT
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 1) AS VALUE1
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 2) AS VALUE2
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 3) AS VALUE3
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 4) AS VALUE4
FROM inserted
GROUP BY TS 

Возможное решение вашей проблемы, указанное в комментарии:

С помощью этого непроверенного запроса вы вставляете последний, а не текущий TSв целевой таблице.Таким образом, вы гарантируете, что просто обновляете, когда пишется последняя запись TS, поэтому перед вставкой у вас есть все записанные значения (1..4).

Это может быть медленно: -).Но я не знаю лучшего способа.

SELECT 
 DISTINCT TOP 1
 TS
 ,(SELECT VALUE FROM
    (SELECT MT.TS, MT.VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable MT
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 1) AS VALUE1
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 2) AS VALUE2
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 3) AS VALUE3
,(SELECT VALUE FROM
    (SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
    FROM myTable
    WHERE MT.TS = TS) DATASET
    WHERE DATASET.ROWNUMBER = 4) AS VALUE4
 FROM myTable
 WHERE TS < (SELECT MIN(TS) FROM INSERTED)
 AND TS NOT IN (SELECT TS FROM MyTargetTable)
 GROUP BY TS 
0 голосов
/ 06 февраля 2012

Кто-то мог бы сделать это намного проще для вас ... Грязно и хрупко

В основном вам нужно

Узнайте, есть ли у вас запись в myTargetTable для отметки времени.если нет, введите одно значение настройки1.если вы это сделаете, вам нужно проверить наличие свободного слота (значения от 2 до 4) и обновить.

Если у вас вставлен ValueNumber, вы можете сделать что-то более надежное.

ЛичноЯ бы соблазнился нормализовать это и иметь MyTargetTable быть TimeStamp, ValueNumber, Value, хотя это увеличило бы ваши требования к хранилищу на три временных метки и четыре целых, если вы всегда получите все четыре значения.Все, что я могу сказать, это каждый раз, когда я видел таблицу с Column1 to ColumnN, это было, когда кто-то должен был ее нормализовать.(

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...