SQL Server находит разницу между разными строками, сумму

Я пытаюсь создать запрос, который анализирует данные в нашей системе отслеживания времени. Каждый раз, когда пользователь проводит пальцем внутрь или наружу, создается строка, в которой фиксируется время проведения и состояние на сайте или вне его (вход или выход). В случае пользователя Joe Bloggs есть 4 строки, которые я хочу соединить и рассчитать общее время, проведенное на сайте для Joe Bloggs.

Проблема в том, что есть записи, которые не так просто спарить. В приведенном примере второй пользователь имеет два последовательных значения «включено», и мне нужно найти метод для игнорирования повторяющихся строк «включено» или «выключено».

ID  | Time                    |OnOffSite| UserName   
------------------------------------------------------
123 | 2011-10-25 09:00:00.000 | on      | Bloggs Joe |
124 | 2011-10-25 12:00:00.000 | off     | Bloggs Joe |
125 | 2011-10-25 13:00:00.000 | on      | Bloggs Joe |
126 | 2011-10-25 17:00:00.000 | off     | Bloggs Joe |
127 | 2011-10-25 09:00:00.000 | on      | Jonesy Ian |
128 | 2011-10-25 10:00:00.000 | on      | Jonesy Ian |
129 | 2011-10-25 11:00:00.000 | off     | Jonesy Ian |
130 | 2011-10-25 12:00:00.000 | on      | Jonesy Ian |
131 | 2011-10-25 15:00:00.000 | off     | Jonesy Ian |

Моя система - MS SQL 2005. Отчетный период для запроса - Ежемесячно.

Кто-нибудь может предложить решение? мои данные уже сгруппированы в таблице по имени пользователя и времени, а полем ID является Identity.


person MarcKirby    schedule 26.10.2011    source источник
comment
Какой on для Джонси Иэна вы хотите оставить?   -  person Lieven Keersmaekers    schedule 26.10.2011
comment
Под «Каждый раз, когда пользователь проводит пальцем», вы имеете в виду «Каждый раз, когда пользователь аутентифицируется»?   -  person npclaudiu    schedule 26.10.2011
comment
Я хотел бы добавить второе «вкл», и да, проводя пальцем, я имею в виду аутентификацию. Спасибо за ответы :) Сегодня попробую протестировать.   -  person MarcKirby    schedule 27.10.2011


Ответы (2)


Сначала вам нужно поговорить с бизнес-стороной и определиться с набором правил соответствия.

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

person Klas Lindbäck    schedule 26.10.2011

person    schedule
comment
Этот ответ правильный и отлично работает с моими данными. Есть Мастер T-SQL и зовут его Алексей! Огромное спасибо. - person MarcKirby; 27.10.2011
comment
+1. Мое решение было почти таким же. Я использовал ранжирование с самого начала, и я вижу, что в какой-то момент вы также изменили промежуточную группировку на ранжирование. Единственная оставшаяся разница заключалась в том, как я получил timeon и timeoff: я использовал самосоединение, которое, я думаю, в этом случае хуже, чем группировка & max(case ...), которую вы использовали в своем ответе. В любом случае, это хорошо работает, так что... молодец! :) - person Andriy M; 27.10.2011