1.表

mysql生成伪列 mysql数据库伪列_mysql生成伪列

向表中插入 随机产生的id

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

mysql生成伪列 mysql数据库伪列_数据库_02

 

 

 

2.查询时候插入伪列

2.1  方式一

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

mysql生成伪列 mysql数据库伪列_python_03

2.2 方式二

select RowNum=IDENTITY(INT,1,1),  * into #temp1  from t_c 
 select * from #temp1 -- 查询临时表
drop table   #temp1 -- 清除临时表

mysql生成伪列 mysql数据库伪列_数据库_04

3.工作中的使用

3.1效果

mysql生成伪列 mysql数据库伪列_mysql生成伪列_05

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