使用位运算 数据分析 - 用户历史
时间:2010-10-21 来源:liukaiyi
为解决用户的同属性 大量操作存储问题 :
数据库表结果: 用户 | 属性域+ | 当前时间 | 最小时间力度 | int | int .....
比如 :
      用户1 | 频道1 | ....   | 2010-10-01 | 1天   | 0 
  
  
      .....
  
  
    
  
  
    表结构为 ( 预订表存储 一个月 2010-10 ) :
  
  
    
      
        
          create table test ( 
        
        
             uid int primary key , 
        
        
             domain varchar(20),
        
        
             starttime datetime,
        
        
             endtime  datetime,
        
        
             touch int ,
        
        
             unique(uid,domain,starttime ) );
        
        
          
        
      
    
  
  
    
  
  
  
     
  
  
 
 
    用户分别在 10-05 ,10-13  ,10-20 天来过
  
  
    
    
  
  
  
 
	
	
      #10-05 减去 10-01  为 5 天 
    
    
      
        
          
            
              
                insert into test values 
              
              
                  (1,'yy-xx','2010-10-01','2010-10-05',1<<DATEDIFF(endtime,starttime )  ) 
              
              
                on duplicate key 
              
              
                   update endtime = '2010-10-05'  ,  
              
              
                          touch = ( 1<<DATEDIFF(endtime,starttime)|touch) ; 
              
            
          
          
            
# 10-13 减去 10-01 为 13天 insert into test values (1,'yy-xx','2010-10-01','2010-10-13',1<<DATEDIFF(endtime,starttime ) ) on duplicate key update endtime = '2010-10-13' , touch = ( 1<<DATEDIFF(endtime,starttime)|touch) ;
                    
                  
                
              
              
  
  
    
  # 10-13 减去 10-01 为 13天 insert into test values (1,'yy-xx','2010-10-01','2010-10-13',1<<DATEDIFF(endtime,starttime ) ) on duplicate key update endtime = '2010-10-13' , touch = ( 1<<DATEDIFF(endtime,starttime)|touch) ;
                # 10-20 减去 10-01  为 20 天 
              
            
          
        
      
    
    
      
        
          
            
              
                
                  
                    
                      
                        
                          
                            insert into test values 
                          
                          
                              (1,'yy-xx','2010-10-01','2010-10-20',1<<DATEDIFF(endtime,starttime )  ) 
                          
                          
                            on duplicate key 
                          
                          
                               update endtime = '2010-10-20'  ,  
                          
                          
                                      touch = ( 1<<DATEDIFF(endtime,starttime)|touch) ; 
                          
                        
                      
                    
                  
                
              
            
          
        
      
    
  
  
当前月 来的 总天数 : > select BIT_COUNT(touch) from test ;
  
上周来天数 (2010-10-03 到 2010-10-09) : > select bit_count( ( touch >> datediff('2010-10-03',starttime) ) & (1<<datediff('2010-10-09','2010-10-03'))-1 ) from test ;
  
还有 许多这样的想法 , 后面再说吧 下班 ~
  
  
  
  
  
  当前月 来的 总天数 : > select BIT_COUNT(touch) from test ;
上周来天数 (2010-10-03 到 2010-10-09) : > select bit_count( ( touch >> datediff('2010-10-03',starttime) ) & (1<<datediff('2010-10-09','2010-10-03'))-1 ) from test ;
还有 许多这样的想法 , 后面再说吧 下班 ~
 相关阅读 更多 + 
    
  









