Выравнивание даты и сопоставление пары лучше всего сделано с TSQL или C#?

dba.stackexchange https://dba.stackexchange.com/questions/1103

  •  16-10-2019
  •  | 
  •  

Вопрос

Для начала с: мой название - отстой, так что помогите мне выяснить новый?

Я не могу опубликовать все SQL здесь (более 30 тысяч символов на многое), поэтому я застрял на pastebin.com

Проблема:

Я получаю XML -файл, из которого я соскрею несколько записей, и мне нужно извлечь некоторые данные из записей и создать еще одну таблицу. Записи предназначены для события, идущего и появляются, и я включил образцы данных в Pastebin для воссоздания. Не видя данные, это довольно сложно объяснить. Я дал все данные, которые у меня есть от моего импорта примера, которые должны быть достаточными для создания приложения, но я не получаю больше информации, чем то, что показано в данных.

Я дам вам момент, чтобы взглянуть на данные, так что это имеет смысл.

Итак, мне нужно сделать: для каждого события «Off» мне нужно сопоставить его с следующим »на« Событие », и мне нужно иметь две таблицы в конце, одна таблица для« исторических событий »и одна таблица Для «текущих событий». Однако, если я смогу просто построить «исторические события» правильно, я смогу выяснить, как получить «текущие события» от этого.

Бизнес правила:

Если два или более события «выключаются» до события «On», оставьте самое старое «вне». Если два или более событий «на» собираются перед событием «Off», сохраните новейшее »событие. Если есть полная пара, поместите их в исторический стол. Если есть событие «вне», а не событие «на», поместите его в текущую таблицу (поэтому, если я хочу продолжать вставлять/удалять из этой таблицы, это тоже нормально). Если в текущей таблице уже есть событие «выключенного», я могу взять его и перенести его в историческую таблицу для прочтения события «на» (это должно быть реализовано позже, но если я смогу подключиться к паре Первоначально я смогу идти вперед.

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

Запросы, которые я уже не работает, но именно здесь я пришел к своему началу, прежде чем отправиться домой в пятницу, и с тех пор я размышлял над этим и строю проблему, которую я могу опубликовать онлайн (и вся эта жизнь тоже знаете). Данные являются живыми данными и точными, за исключением анонимизированного идентификатора, а текстовые поля изменились на что -то простое для работы.

Вот электронная таблица, показывающая примерно так, как я хочу, чтобы данные смотрели на конец, и как это выглядит сейчас. Существуют текущие данные (с простальной строкой между каждым идентификатором для ясности), данные, которые будут в исторической таблице (соответствуют идентификатору исходных данных для понимания) и текущей таблицы (снова выровненная). Я надеюсь, что это может помочь прояснить бизнес -правила.https://spreadsheets.google.com/ccc?key=0auvcdehuvu5ddhrcnkpuwhureprajlmlu5vx2xswnc&hl=en&authkey=coq7y50h

Таким образом, полный SQL, включающий планшет и текущие (очень не правые) запросы на Pastebin http://pastebin.com/k2f2clnq

Это было полезно?

Решение 2

Итак, для продолжения комментариев и, как, вероятно, будет ответом:

Я только что пошел вперед и экспортировал его в C# и обработал его там. Это будет легче сделать это процедурно, чем наборами, и мне все еще нужно выяснить, что выходит на первое место, выключено или включено (когда они одновременно). Работая с их премьер -министром, чтобы знать, но у меня есть чувство, даже они не знают, что происходит, когда.

В любом случае, так что все обсуждения хранятся в одном месте, см. Также эту стенограмму: (если вам действительно интересно) http://chat.stackexchange.com/rooms/179/conversation/date-allignment-and-pair-matching-extraction-best-done-with-tsql-or-c Так вот это.

Другие советы

Вот кое -что, с чем я возился, основываясь на какой -то работе, которую я лежал вокруг. Это не Обработайте события, кластерированные за одно время. Теоретически это может быть полезно ... :)

;WITH ordered_rows AS
(
    SELECT ROW_NUMBER() OVER(PARTITION BY Identifier ORDER BY EventTime) AS Row,
        Identifier, Type, EventTime, DiscoveredDate, FileId FROM #EventDataTemp
)
,filtered_rows AS
(
    SELECT Row, Identifier, Type, EventTime, DiscoveredDate, FileId, 
        CAST(CASE Type WHEN 'Went Off' THEN 1 ELSE NULL END AS INT) 
            AS OffEventRow
    FROM ordered_rows
    WHERE Row = 1
    UNION ALL
    SELECT o.Row, o.Identifier, o.Type, o.EventTime, o.DiscoveredDate, o.FileId,
        CAST(CASE WHEN o.Type = 'Went Off' AND f.Type = 'Went Off' 
            OR o.Type = 'Came On' THEN f.OffEventRow ELSE o.Row END AS INT)
    FROM ordered_rows o INNER JOIN filtered_rows f 
        ON o.Row = f.Row + 1 AND o.Identifier = f.Identifier
)
,on_events AS
(
   SELECT Identifier, OffEventRow, MAX(Row) AS OnRow
   FROM filtered_rows
   WHERE Type = 'Came On' AND OffEventRow IS NOT NULL
   GROUP BY OffEventRow, Identifier
)
SELECT f.Identifier, f.Type, f.EventTime, f.DiscoveredDate, f.FileId 
FROM filtered_rows f LEFT JOIN on_events o 
    ON f.Identifier = o.Identifier 
    AND f.Row = o.OnRow
WHERE f.Type = 'Went Off' AND f.Row = f.OffEventRow
OR f.Type = 'Came On' AND o.OnRow IS NOT NULL
ORDER BY f.Identifier, f.EventTime
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top