插入临时 table 迭代 ID 列

Insert into temporary table an iterate an ID column

我有一个 select 语句将数据插入 #temptable,它看起来像这样:

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,但有一些条件:

我应该如何进行?任何帮助表示赞赏。

编辑:我想要的结果:

|  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

如果我理解正确,您希望 logins 具有增量 ID,中间的所有行具有相同的 ID。

另一种表达方式是 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 服务器的早期版本中,您可以使用 outer apply.

执行此操作

编辑:

以上(虽然有用)并没有完全理解问题。相反:

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;