SQL 从另一个具有聚合函数的 table 变量插入到 table 变量?
SQL to insert into table variable from another table with aggregate function?
我的来源 table 是一个 table 有数千条记录。主键是列 [data_serial_num].
SELECT TOP 1000
[data_serial_num]
,[foreign_serial_num]
,[msg_id]
,[data_value]
,[timestamp]
,[a]
,[b]
FROM [external_data]
我想我会创建一个 table 变量来保存由 [foreign_serial_num] 和 [msg_id] 组成的唯一复合键,它还包含 [data_value] 和来自 [timestamp] 的最近时间。
declare @filtered_data table
(
foreign_serial_num bigint not null
,msg_id bigint not null
,data_value bigint
,timestamp datetimeoffset(7)
PRIMARY KEY(vehicle_serial_num, msg_id)
)
所以要插入 table 变量,我想我会做这样的事情:
insert into @filtered_data
select foreign_serial_num, msg_id, data_value, max(timestamp) 'timestamp'
from external_data
group by foreign_serial_num, msg_id
该插入显然不起作用,因为 [data_value] 必须在 group by 子句中,但 return 不是唯一记录。
下面是 的作用,但我不知道如何将 [data_value] 列和数据获取到 table 变量中。
declare filtered_data table
(
foreign_serial_num bigint not null
,msg_id bigint not null
,timestamp datetimeoffset(7)
PRIMARY KEY(vehicle_serial_num, msg_id)
)
insert into filtered_data
select foreign_serial_num, msg_id, max(timestamp) 'timestamp'
from external_data
group by foreign_serial_num, msg_id
select * from filtered_data
示例预期输出:
foreign_serial_num | msg_id | data_value | timestamp
20 | 1 | 0 | 2015-01-14 16:02:47.0000000 -08:00
20 | 2 | 45 | 2015-01-14 16:02:47.0000000 -08:00
20 | 3 | 10 | 2014-11-10 15:41:36.0000000 -08:00
155 | 1 | 0 | 2015-02-27 10:43:09.0000000 -08:00
155 | 2 | 33 | 2015-02-27 10:43:09.0000000 -08:00
155 | 3 | 0 | 2015-02-27 10:43:09.0000000 -08:00
所以我的问题是,什么是从 [external_data] table 获取 [data_value] 到我的 table 变量同时保持复合主键 [foreign_serial_num] 和 [msg_id] 以及来自 [timestamp]?
的最新时间
select * from
(
select foreign_serial_num, msg_id, data_value, timestamp
, row_number() over (partition by oreign_serial_num, msg_id order by timestamp desc) as rn
from external_data
) ordered
where ordered.rn = 1
我的来源 table 是一个 table 有数千条记录。主键是列 [data_serial_num].
SELECT TOP 1000
[data_serial_num]
,[foreign_serial_num]
,[msg_id]
,[data_value]
,[timestamp]
,[a]
,[b]
FROM [external_data]
我想我会创建一个 table 变量来保存由 [foreign_serial_num] 和 [msg_id] 组成的唯一复合键,它还包含 [data_value] 和来自 [timestamp] 的最近时间。
declare @filtered_data table
(
foreign_serial_num bigint not null
,msg_id bigint not null
,data_value bigint
,timestamp datetimeoffset(7)
PRIMARY KEY(vehicle_serial_num, msg_id)
)
所以要插入 table 变量,我想我会做这样的事情:
insert into @filtered_data
select foreign_serial_num, msg_id, data_value, max(timestamp) 'timestamp'
from external_data
group by foreign_serial_num, msg_id
该插入显然不起作用,因为 [data_value] 必须在 group by 子句中,但 return 不是唯一记录。
下面是 的作用,但我不知道如何将 [data_value] 列和数据获取到 table 变量中。
declare filtered_data table
(
foreign_serial_num bigint not null
,msg_id bigint not null
,timestamp datetimeoffset(7)
PRIMARY KEY(vehicle_serial_num, msg_id)
)
insert into filtered_data
select foreign_serial_num, msg_id, max(timestamp) 'timestamp'
from external_data
group by foreign_serial_num, msg_id
select * from filtered_data
示例预期输出:
foreign_serial_num | msg_id | data_value | timestamp
20 | 1 | 0 | 2015-01-14 16:02:47.0000000 -08:00
20 | 2 | 45 | 2015-01-14 16:02:47.0000000 -08:00
20 | 3 | 10 | 2014-11-10 15:41:36.0000000 -08:00
155 | 1 | 0 | 2015-02-27 10:43:09.0000000 -08:00
155 | 2 | 33 | 2015-02-27 10:43:09.0000000 -08:00
155 | 3 | 0 | 2015-02-27 10:43:09.0000000 -08:00
所以我的问题是,什么是从 [external_data] table 获取 [data_value] 到我的 table 变量同时保持复合主键 [foreign_serial_num] 和 [msg_id] 以及来自 [timestamp]?
的最新时间select * from
(
select foreign_serial_num, msg_id, data_value, timestamp
, row_number() over (partition by oreign_serial_num, msg_id order by timestamp desc) as rn
from external_data
) ordered
where ordered.rn = 1