zoukankan      html  css  js  c++  java
  • 数据库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
    ;
  • 相关阅读:
    【解题报告】 [YNOI2019]排队
    【解题报告】[AHOI2001]彩票摇奖
    【解题报告】 [NOIP2006]能量项链
    【解题报告】 启示录
    【解题报告】 【NOIP2018】 摆渡车
    【解题报告】 【NOIP2017】 奶酪
    C# winform 窗体从右下角向上弹出窗口效果
    C#开发COM+组件和ActiveX控件
    JQuery
    How to delete a team project from Team Foundation Service (tfs.visualstudio.com)
  • 原文地址:https://www.cnblogs.com/zhongjiajie/p/5652557.html
Copyright © 2011-2022 走看看