插入临时表中迭代ID列

时间:2016-06-15 10:35:56

标签: tsql sybase-ase

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

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(例如,对于第一次登录,给出Id = 1)
  • 然后下一次登录有Id = 2
  • 对于具有相同AnotherId的Login和Logout之间的命令,然后输入相应的Id(例如,对于AnotherId = 10,我应该拥有所有具有AnotherId = 10 - >> Id = 1的行)

我该怎么办?任何帮助表示赞赏。

编辑:我想要的结果:

|  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 :(得分:2)

如果我理解正确,您希望login具有增量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 Server中,您可以使用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;