插入临时 table 迭代 ID 列
Insert into temporary table an iterate an ID column
我有一个 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 的登录和注销之间的命令,然后放置相应的 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
如果我理解正确,您希望 login
s 具有增量 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;
我有一个 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 的登录和注销之间的命令,然后放置相应的 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
如果我理解正确,您希望 login
s 具有增量 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;