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
    ;
  • 相关阅读:
    Confluence 6 恢复一个站点
    Confluence 6 重新获得站点备份文件
    Confluence 6 创建站点的导出文件
    Confluence 6 手动备份站点
    Confluence 6 用户提交的备份和恢复脚本
    Confluence 6 配置手动备份
    Confluence 6 配置自动备份
    Confluence 6 其他需要备份和恢复的地方
    MySQL多线程备份工具mydumper
    创意、实现和合作:一次原创H5的尝试
  • 原文地址:https://www.cnblogs.com/zhongjiajie/p/5652557.html
Copyright © 2011-2022 走看看