Hive面试题之连续登录、行转列和列转行分析

数据准备

+---+----------+|id |login_date|+---+----------+|01 |2021-02-28||01 |2021-03-01||01 |2021-03-02||01 |2021-03-04||01 |2021-03-05||01 |2021-03-06||01 |2021-03-08||02 |2021-03-01||02 |2021-03-02||02 |2021-03-03||02 |2021-03-06||03 |2021-03-06|+---+----------+

方案一

1.先把数据按照用户id分组,根据登录日期排序

SQL:

,
   ,
   () (      )
 ;

结果:

+---+----------+---+|id |login_date|rn |+---+----------+---+|01 |2021-02-28|1  ||01 |2021-03-01|2  ||01 |2021-03-02|3  ||01 |2021-03-04|4  ||01 |2021-03-05|5  ||01 |2021-03-06|6  ||01 |2021-03-08|7  ||02 |2021-03-01|1  ||02 |2021-03-02|2  ||02 |2021-03-03|3  ||02 |2021-03-06|4  ||03 |2021-03-06|1  |+---+----------+---+

2.用登录日期与rn求date_sub,得到的差值日期如果是相等大数据培训的,则说明这两天肯定是连续的

SQL:

.,
     .,
     (., )  

    (

           ,
           ,
           () (      )   

    ) ;

结果:

+---+----------+----------+|id |login_date|diff_date |+---+----------+----------+|01 |2021-02-28|2021-02-27||01 |2021-03-01|2021-02-27||01 |2021-03-02|2021-02-27||01 |2021-03-04|2021-02-28||01 |2021-03-05|2021-02-28||01 |2021-03-06|2021-02-28||01 |2021-03-08|2021-03-01||02 |2021-03-01|2021-02-28||02 |2021-03-02|2021-02-28||02 |2021-03-03|2021-02-28||02 |2021-03-06|2021-03-02||03 |2021-03-06|2021-03-05|+---+----------+----------+

3.根据id和日期差date_diff分组,登录次数即为分组后的count(1)

SQL:

.,
 ()            ,
 (.)  ,
 (.)  

(

     .,
     .,
     (.,)  

    (

         ,
         ,
         () (      )   

    )
)
  ., .
   ;

结果:

+---+-----------+----------+----------+|id |login_times|start_date|end_date  |+---+-----------+----------+----------+| 01|3          |2021-02-28|2021-03-02|| 01|3          |2021-03-04|2021-03-06|| 02|3          |2021-03-01|2021-03-03|+---+-----------+----------+----------+

方案二方案二利用lag和lead函数进行处理,思路类似。

SQL:

,
  ,
  ,

      (
         ,
         ,
         (,,) (     )  ,
         (,,) (     )  

      )
 (,)   (,) ;

结果:

+---+--------------+----------+---------------+|id |lag_login_date|login_date|lead_login_date|+---+--------------+----------+---------------+|01 |2018-02-28    |2018-03-01|2018-03-02     ||01 |2018-03-04    |2018-03-05|2018-03-06     ||02 |2018-03-01    |2018-03-02|2018-03-03     |+---+--------------+----------+---------------+

行转列和列转行 以"连续登录"中的数据为例:

,
       (,()) 

  ;

结果:

,,,,,,
 ,,,

以上面SQL生成的数据为基准,执行下列SQL:

, 

   ((,))    ;

结果:

+---+----------+|id |login_date|+---+----------+|01 |2018-02-28||01 |2018-03-01||01 |2018-03-02||01 |2018-03-04||01 |2018-03-05||01 |2018-03-06||01 |2018-03-08||02 |2018-03-01||02 |2018-03-02||02 |2018-03-03||02 |2018-03-06||03 |2018-03-06|+---+----------+

(0)

相关推荐