• 疯狂值班表(人员跟日期生成的视图)


    第一种人员表跟日期表(人员轮流值班)

    上面是按照指定到了人员值班,自动查找的人员值班,以下是代码

    --用户表中字段:id,login_name.数据如下:
    select id,login_name from Au_user;
    
    --假设指定用户从id=54开始轮流值班,并且按id升序轮流值班。则先对用户表进行序号排序
    select row_number()over(order by seq asc, id asc )-1 as RowNum,* from 
    (
    	select id,login_name,0 as seq from au_user where id>=54 
    	union ALL
    	select id,login_name,1 as seq from au_user where id<54 
    ) t1 
    
    -- 假设日期表为:temp_table_date
    select * from temp_table_date;
    
    -- 假设日期为2至10号,从小日期至大日期轮流值日:
    --给日期表设置序号
    select RowNum%(select count(1) from Au_user) as r_row_num,date_field from 
    (
    	select row_number()over(order by date_field asc )-1 as RowNum,date_field from temp_table_date
    ) t2
    ;
    
    --组合起来,结果如下:
    select * from 
    (
    		select row_number()over(order by seq asc, id asc )-1 as RowNum,id,login_name from 
    		(
    			select id,login_name,0 as seq from au_user where id>=54 
    			union ALL
    			select id,login_name,1 as seq from au_user where id<54 
    		) t1 
    ) V1
    LEFT JOIN 
    (
    		select RowNum%(select count(1) from Au_user) as r_row_num,date_field from 
    		(
    			select row_number()over(order by date_field asc )-1 as RowNum,date_field from temp_table_date
    		) t2
    ) V2 ON V1.RowNum=V2.r_row_num 
    ORDER BY V2.date_field ASC
    

      第二种,有班级,人员表关联班级,所产生的值班数据

     mod(v1.RowNum,v2.user_count)  改为v1.RowNum%v2.user_count (具体看情况用)
     获取分组序号,这个知识点很关键row_number()over(PARTITION  by CLASS_ID order by ORDER_ desc ,id asc )  
    以上数据代码如下
    select r1.class_id,r1.class_name,r1.CURRENT_USER_ID,R2.ID AS Login_id,r2.login_name,r1.date_field from (
    select v1.class_id,v1.class_name,V1.CURRENT_USER_ID,v1.date_field,v2.user_count,v1.RowNum,mod(v1.RowNum,v2.user_count) as class_mod from 
    (select t1.ID as class_id,t1.CLASS_NAME,t1.CURRENT_USER_ID,t2.RowNum,t2.DATE_FIELD from  
        view_table_class t1 ,
        (select row_number()over(order by date_field asc )-1 as RowNum,date_field from temp_table_date) t2 
    ) v1
    left join 
    (select class_id,count(1) as user_count from AU_USER group by CLASS_ID) v2
    on v1.class_id =v2.class_id
    ) r1
    left join (
        select row_number()over(PARTITION  by CLASS_ID order by ORDER_ desc ,id asc )-1 as RowNum,v.* from 
        (
            select   t1.id,t1.LOGIN_NAME,t1.CLASS_ID,t2.CLASS_NAME,t2.CURRENT_USER_ID,
            case when t1.id>=t2.CURRENT_USER_ID then 1 else 0 end as ORDER_ from au_user t1 left join view_table_class t2 on t1.CLASS_ID=t2.ID 
        ) v
    ) r2 on R1.CLASS_ID=R2.CLASS_ID AND r1.class_mod=r2.RowNum
    order by r1.class_id ASC,DATE_FIELD ASC
    

      

     
     之前代码优化一下,换成以下代码: 
    -- 查询结果
    select r1.class_id,r1.class_name,r1.CURRENT_USER_ID,R2.ID AS Login_id,r2.login_name,r1.date_field from (
        select v1.id as class_id,v1.class_name,V1.CURRENT_USER_ID,v1.date_field,v2.user_count,v1.RowNum,mod(v1.RowNum,v2.user_count) as class_mod 
        from (
            select row_number()over(PARTITION  by id order by date_field asc )-1 as RowNum,t1.*,t2.*
            from view_table_class t1,temp_table_date  t2
        ) v1 left join 
        (select class_id,count(1) as user_count from AU_USER group by CLASS_ID) v2
        on v1.id =v2.class_id
    ) r1
    left join (
        select row_number()over(PARTITION  by CLASS_ID order by ORDER_ desc ,id asc )-1 as RowNum,v.* from 
        (
            select   t1.id,t1.LOGIN_NAME,t1.CLASS_ID,t2.CLASS_NAME,t2.CURRENT_USER_ID,
            case when t1.id>=t2.CURRENT_USER_ID then 1 else 0 end as ORDER_ from au_user t1 left join view_table_class t2 on t1.CLASS_ID=t2.ID 
        ) v
    ) r2 on R1.CLASS_ID=R2.CLASS_ID AND r1.class_mod=r2.RowNum
    order by r1.class_id ASC,DATE_FIELD ASC
    

      原创作品,转载请在明显位置写明原创地址

  • 相关阅读:
    谦谦君子 温润如玉
    [Linux: vim]vim自动生成html代码
    /boot/grub/grub.conf 内容诠释
    mini_httpd在RedHat 5下安装
    html 简单学习
    v4l
    手机处理器哪个好 智能手机处理器进化知识
    小败局】一位草根北漂创业者自述:赚钱的快餐店之死
    读书
    手游研发CJ抱大腿指南
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/6249429.html
Copyright © 2020-2023  润新知