65.数据库伪列的使用

1.表

151230_iMKb_3015807.png

向表中插入 随机产生的id

    lower(replace(newid(),'-',''))

151503_VhOo_3015807.png

 

 

 

2.查询时候插入伪列

2.1  方式一

select RN=ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), * from t_c

151631_ddZ4_3015807.png

2.2 方式二

select RowNum=IDENTITY(INT,1,1),  * into #temp1  from t_c 


select * from #temp1 -- 查询临时表

drop table   #temp1 -- 清除临时表

151943_42hV_3015807.png

3.工作中的使用

3.1效果

140114_29P3_3015807.png

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
 

 

 

 

转载于:https://my.oschina.net/springMVCAndspring/blog/1588505

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值