数据库SQL面试题1

今天一个技术群发了三道数据库面试题,可把大家乐开了花,题目如下:

请用sql实现以下的功能

做了其中的两道题,还有一题不知道怎么做,还望大神赐教!

第一题:

  不会做!!在这里请大神帮忙,我为你提供一张临时表

WITH tmp AS (
             SELECT 100 AS userid,202 AS logid,'i' AS status FROM dual UNION ALL
             SELECT 100 AS userid,203 AS logid,'s' AS status FROM dual UNION ALL
             SELECT 100 AS userid,204 AS logid,'p' AS status FROM dual UNION ALL
             SELECT 101 AS userid,300 AS logid,'i' AS status FROM dual UNION ALL
             SELECT 101 AS userid,302 AS logid,'p' AS status FROM dual UNION ALL
             SELECT 101 AS userid,330 AS logid,'i' AS status FROM dual UNION ALL
             SELECT 101 AS userid,335 AS logid,'p' AS status FROM dual UNION ALL
             SELECT 101 AS userid,401 AS logid,'p' AS status FROM dual
)

第二题:

--生成一张临时表                      
WITH tmp AS (
              SELECT 1 AS ID,2 AS val FROM dual UNION ALL
              SELECT 1 AS ID,3 AS val FROM dual UNION ALL
              SELECT 1 AS ID,4 AS val FROM dual UNION ALL
              SELECT 2 AS ID,5 AS val FROM dual UNION ALL
              SELECT 2 AS ID,6 AS val FROM dual UNION ALL
              SELECT 2 AS ID,7 AS val FROM dual
            )
SELECT ID,
       MAX(val)
FROM (
      SELECT ID,
             exp(SUM(ln(val)) over(PARTITION BY ID ORDER BY val)) AS val
      FROM tmp
     )
GROUP BY ID
;

  最要用到了一点数学的知识,通过ln和exp对表进行处理,用窗口函数对id进行分组,然后ln(val)这样就会得到e为底,幂为val的指数的值,然后用sum吧同一分组下的指数进行求和,然后再用exp函数求回幂。

第三题:

--生成一张临时表
WITH tmp AS (
              SELECT 1 AS ID,2 AS val FROM dual UNION ALL
              SELECT 1 AS ID,3 AS val FROM dual UNION ALL
              SELECT 1 AS ID,4 AS val FROM dual UNION ALL
              SELECT 2 AS ID,5 AS val FROM dual UNION ALL
              SELECT 2 AS ID,6 AS val FROM dual UNION ALL
              SELECT 2 AS ID,7 AS val FROM dual
            )
SELECT ID,
       listagg(val,',') within GROUP(ORDER BY ID) AS info
FROM tmp
GROUP BY ID
;

  主要用了listagg这个函数,函数的用法如下:

LISTAGG(field1,'delimited') WITHIN GROUP(ORDER BY field2)  …………  GROUP BY field2

实现了按照字段field2进行分组,然后把字段field1用分隔符delimited进行拼接的一个方法。

  延伸一下,也可以用窗口函数实现每条记录的显示情况,就会实现窗口函数的功能了

--生成一张临时表
WITH tmp AS (
              SELECT 1 AS ID,2 AS val FROM dual UNION ALL
              SELECT 1 AS ID,3 AS val FROM dual UNION ALL
              SELECT 1 AS ID,4 AS val FROM dual UNION ALL
              SELECT 2 AS ID,5 AS val FROM dual UNION ALL
              SELECT 2 AS ID,6 AS val FROM dual UNION ALL
              SELECT 2 AS ID,7 AS val FROM dual
            )
SELECT ID,
       listagg(val,',') within GROUP(ORDER BY 1) over(PARTITION BY ID) AS info
FROM tmp
;
原文地址:https://www.cnblogs.com/zhongjiajie/p/5652557.html