我有一个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 | 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
答案 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;