1.表
向表中插入 随机产生的id
lower(replace(newid(),'-',''))
2.查询时候插入伪列
2.1 方式一
select RN=ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), * from t_c
2.2 方式二
select RowNum=IDENTITY(INT,1,1), * into #temp1 from t_c
select * from #temp1 -- 查询临时表
drop table #temp1 -- 清除临时表
3.工作中的使用
3.1效果
3.2 存储
第一版 :没有使用批量插入数据
-- =============================================
-- Author: me
-- Create date: 2017-12-13 17:03
-- Description: 学习伪列
-- Test: t_my_studyRowNum
-- =============================================
alter PROCEDURE t_my_studyRowNum
-- 参数
AS
BEGIN
SET NOCOUNT ON;
-- 变量
declare @num int --记录数据条数
declare @sitecode varchar(50) --存放每次循环的sitecode
declare @update_date date -- 存放循环的日期
declare @revised_monitor_value varchar(50) --存放循环的值
declare @site_code varchar(150)
declare @i int
-- sql
--创建临时表
create table #result(
text date,
value varchar(15),
sitecode varchar(20)
)
select RowNum=IDENTITY(INT,1,1), * into #t1 from ( select site_code from t_dusty_monitor_factor_rtdata group by site_code ) a -- 按照排口进行分类 添加伪列放到临时表 #t1中
select @num = count(site_code) from #t1 -- 查询出临时表 #t1表的个数
-- 循环 处理每一个
while @num>0
begin
select @sitecode = site_code from #t1 where RowNum=@num -- 利用伪列的值 与#t1表中数据条数 作为条件 进行查询 将每次查到到的sitecode放到变量@sitecode中
select top 5 RowNum2=IDENTITY(INT,1,1), a.update_date,a.revised_monitor_value,a.site_code into #t2
from t_dusty_monitor_factor_rtdata a where site_code=@sitecode order by update_date asc -- 从实时表中 根据排口 将每个排口下最新的5条数据拿出 放到临时表 #t2中 带伪列的
-- print(@sitecode);
set @num=@num-1 -- 每循环一次变量-1 避免死循环
set @sitecode=null -- 每次清空数据
set @i=(select count(*) from #t2) ; -- 拿到#t2临时表中数据的条数
-- 循环 t2表 将每一条数据插入到临时表 #result 中
while(@i>0)
begin
select @update_date = update_date from #t2 where RowNum2=@i -- 根据伪列及变量@i 去拿到每条数 将其赋值给变量
select @revised_monitor_value = revised_monitor_value from #t2 where RowNum2=@i
select @site_code = site_code from #t2 where RowNum2=@i insert into #result VALUES (@update_date,@revised_monitor_value,@site_code)
-- 一定要清空 不然如果下一条数据对应的字段是null 变量就会将原来的值保留 导致错误
set @update_date= null
set @revised_monitor_value= null
set @i = @i-1 -- 变量递减
end
drop table #t2
end
select b.sitecode, case when b.text is NULL then GETDATE() else b.text end as text, --对日期为空的处理
cast(round(b.value,3) as numeric(20,3)) as value from #result b order by sitecode desc
set @num=null
set @sitecode=null
drop table #t1
drop table #result
END
GO
第二版:使用批量插入数据
USE [*******_fd]
GO
/****** Object: StoredProcedure [dbo].[t_my_studyRowNum] Script Date: 2017/12/14 15:44:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: me
-- Create date: 2017-12-13 17:03
-- Description: 学习伪列
-- Test: t_my_studyRowNum
-- table: fd 项目
-- =============================================
ALTER PROCEDURE [dbo].[t_my_studyRowNum]
-- 参数
AS
BEGIN
SET NOCOUNT ON;
-- 变量
declare @num int --记录数据条数
declare @sitecode varchar(50) --存放每次循环的sitecode
-- sql
--创建临时表
create table #result(
text date,
value varchar(15),
sitecode varchar(20)
)
select RowNum=IDENTITY(INT,1,1), * into #t1 from ( select site_code from t_dusty_monitor_factor_rtdata group by site_code ) a -- 按照排口进行分类 添加伪列放到临时表 #t1中
select @num = count(site_code) from #t1 -- 查询出临时表 #t1表的个数
-- 循环 处理每一个
while @num>0
begin
select @sitecode = site_code from #t1 where RowNum=@num -- 利用伪列的值 与#t1表中数据条数 作为条件 进行查询 将每次查到到的sitecode放到变量@sitecode中
select top 5 RowNum2=IDENTITY(INT,1,1), a.update_date,a.revised_monitor_value,a.site_code into #t2
from t_dusty_monitor_factor_rtdata a where site_code=@sitecode order by update_date asc -- 从实时表中 根据排口 将每个排口下最新的5条数据拿出 放到临时表 #t2中 带伪列的
-- 批量插入数据
insert into #result(text,value,sitecode) select update_date,revised_monitor_value,site_code from #t2
drop table #t2 -- 每一个排口都有五条数据的 用一次删一次
set @num=@num-1 -- 每循环一次变量-1 避免死循环 end
-- 展示结果
select b.sitecode, case when b.text is NULL then GETDATE() else b.text end as text, --对日期为空的处理
cast(round(b.value,3) as numeric(20,3)) as value from #result b order by sitecode desc
set @num=null
set @sitecode=null
drop table #t1
drop table #result
END