2016-06-15 8 views
0

У меня есть оператор выбора, который вставляет данные в #temptabl е, это выглядит следующим образом:Вставки во временную таблицу итерации идентификационного столбца

select null as ID, Name, AnotherId, date into #TempTable from Table.

В результате #temptable выглядит следующим образом:

| Id | Name | AnotherId |  Datetime  | 
--------------------------------------------------- 
| null | Login | 10  |2016-01-01 15:00:00| 
| null | Command| 10  |2016-01-01 15:00:01| 
| null | Login | 20  |2016-01-01 15:01:00| 
| null | Command| 10  |2016-01-01 15:01:00| 
| null | Logout | 10  |2016-01-01 15:01:01| 
| null | Command| 20  |2016-01-01 15:01:02| 
| null | Logout | 20  |2016-01-01 15:02:00| 

Я хотел бы поставить в колонке Id уникальный идентификатор, но с некоторыми условиями, как:

  • Когда есть Логин присвоить уникальный Id (например, для 1-го входа введите Id = 1)
  • Затем для следующего входа в систему Id = 2
  • Для команд между входом и выходом из системы, которые имеют тот же AnotherId затем помещает соответствующий Id (например, для AnotherId = 10 у меня должны быть все строки, у которых есть AnotherId = 10 -> Id = 1)

Как следует продолжить? Любая помощь оценивается.

Edit: Результаты, которые я хочу:

| Id | Name | AnotherId |  Datetime  | 
| 1 | Login | 10  |2016-01-01 15:00:00| 
| 1 | Command| 10  |2016-01-01 15:00:01| 
| 2 | Login | 20  |2016-01-01 15:01:00| 
| 1 | Command| 10  |2016-01-01 15:01:00| 
| 1 | Logout | 10  |2016-01-01 15:01:00| 
| 2 | Command| 20  |2016-01-01 15:01:02| 
| 2 | Logout | 20  |2016-01-01 15:02:00 
+1

Вы должны отредактировать вопрос и показать результаты, которые вы хотите. Третье условие трудно выразить. –

+0

Отредактирован результат. – MisterM

+0

Мой ответ поможет вам. –

ответ

2

Если я правильно понимаю, вы хотите login с, чтобы иметь дополнительные идентификаторы, со всеми строками, между имеющими один и тем же идентификатором.

Другой способ выразить это то, что id - это номер login с или до данной строки.

В SQL Server 2012+, вы можете сделать это, используя стандарт ANSI кумулятивной функциональности суммы:

select sum(case when name = 'login' then 1 else 0 end) over 
      (partition by anotherId order by datetime) as ID, 
     Name, AnotherId, date 
into #TempTable 
from Table; 

В более ранних версиях SQL Server вы можете сделать это с помощью outer apply.

EDIT:

выше (хотя полезно) не было полного понимания вопроса. Вместо этого:

select (case when name = 'login' then ID 
      else max(ID) over (partition by AnotherId order by DateTime) 
     end) as Id, 
     Name, AnotherId, date 
into #TempTable 
from (select sum(case when name = 'login' then 1 else 0 end) over 
       (order by datetime) as ID, 
      Name, AnotherId, date 
     from Table 
    ) t; 
+0

Я поставил результат, который хотел получить. Но ты понял, что я хотел сказать. Я попробую решение и вернусь к скорости. – MisterM