• MYSQL/HIVESQL笔试题(五):HIVESQL(五)


    10 手写HQL 10

    1.用一条SQL语句查询出每门课都大于80分的学生姓名

    name   kecheng   fenshu

    张三    语文    81

    张三    数学    75

    李四    语文    76

    李四    数学     90

    王五    语文    81

    王五    数学    100

    王五    英语    90

    A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)

    Bselect name from table group by name having min(fenshu)>80

    2. 学生表 如下:
    自动编号   学号  姓名 课程编号 课程名称 分数
    1     2005001 张三   0001   数学   69
    2     2005002 李四   0001   数学   89
    3     2005001 张三   0001   数学   69
    删除除了自动编号不同, 其他都相同的学生冗余信息

    A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)

    3.一个叫team的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,现在四个球队进行比赛,用一条sql语句显示所有可能的比赛组合.

    答:select a.name, b.name
    from team a, team b
    where a.name < b.name

    4.面试题:怎么把这样一个
    year   month amount
    1991   1     1.1
    1991   2     1.2
    1991   3     1.3
    1991   4     1.4
    1992   1     2.1
    1992   2     2.2
    1992   3     2.3
    1992   4     2.4
    查成这样一个结果
    year m1  m2  m3   m4
    1991 1.1 1.2 1.3 1.4
    1992 2.1 2.2 2.3 2.4 

    答案
    select year, 
    (select amount from aaa m where month=1 and m.year=aaa.year) as m1,
    (select amount from aaa m where month=2 and m.year=aaa.year) as m2,
    (select amount from aaa m where month=3 and m.year=aaa.year) as m3,
    (select amount from  aaa m where month=4 and m.year=aaa.year) as m4
    from aaa group by year

    *********************************************************************
    5.说明:复制表(只复制结构,源表名:a新表名:b) 

    SQL: select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容)
    ORACLE:create table b

    As

    Select * from a where 1=2

    [<>(不等于)(SQL Server Compact)

    比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]

    6. 

    原表:
    courseid coursename score
    -------------------------------------
    1 java 70
    2 oracle 90
    3 xml 40
    4 jsp 30
    5 servlet 80
    -------------------------------------
    为了便于阅读,查询此表后的结果显式如下(及格分数为60):
    courseid coursename score mark
    ---------------------------------------------------
    1 java 70 pass
    2 oracle 90 pass
    3 xml 40 fail
    4 jsp 30 fail
    5 servlet 80 pass
    ---------------------------------------------------
    写出此查询语句
    select courseid, coursename ,score ,if(score>=60, "pass","fail")  as mark from course

    7.表名:购物信息

    购物人      商品名称     数量

    A            甲          2

    B            乙          4

    C            丙          1

    A            丁          2

    B            丙          5

    ……

    给出所有购入商品为两种或两种以上的购物人记录

    答:select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);

    8.

    info 表

    date result

    2005-05-09 win

    2005-05-09 lose

    2005-05-09 lose

    2005-05-09 lose

    2005-05-10 win

    2005-05-10 lose

    2005-05-10 lose

    如果要生成下列结果, 该如何写sql语句?

             win lose

    2005-05-09  2   2

    2005-05-10  1   2

    答案: 

    (1) select date, sum(case when result = "win" then 1 else 0 end) as "win", sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date;

    (2) select a.date, a.result as win, b.result as lose

      from

      (select date, count(result) as result from info where result = "win" group by date) as a

      join

      (select date, count(result) as result from info where result = "lose" group by date) as b

    on a.date = b.date;

    11 手写HQL 第11

    有一个订单表order。已知字段有:order_id(订单ID), user_id(用户ID),amount(金额), pay_datetime(付费时间),channel_id(渠道ID),dt(分区字段)。

    1. 在Hive中创建这个表。

    2. 查询dt=‘2018-09-01‘里每个渠道的订单数,下单人数(去重),总金额。

    3. 查询dt=‘2018-09-01‘里每个渠道的金额最大3笔订单。

    4. 有一天发现订单数据重复,请分析原因

    create external table order(
        order_id int,
        user_id int,
        amount double,
        pay_datatime timestamp,
        channel_id int
    )partitioned by(dt string)
    row format delimited fields terminated by '	';
    select
        count(order_id),
        count(distinct(user_id))
        sum(amount)
    from
        order
    where dt="2019-09-01"
    select
        order_id
        channel_id
        channel_id_amount
    from(
        select
            order_id
            channel_id,
            amount,
            max(amount) over(partition by channel_id)
            min(amount) over(partition by channel_id)
            row_number()
            over(
                partition by channel_id
                order by amount desc
            )rank
        from
            order
        where dt="2019-09-01"
    )t
    where t.rank<4

    订单属于业务数据,在关系型数据库中不会存在数据重复

    hive建表时也不会导致数据重复,

    我推测是在数据迁移时,迁移失败导致重复迁移数据冗余了

    t_order订单表

    order_id,//订单id

    item_id, //商品id

    create_time,//下单时间

    amount//下单金额

    t_item商品表

    item_id,//商品id

    item_name,//商品名称

    category//品类

    t_item商品表

    item_id,//商品id

    item_name,//名称

    category_1,//一级品类

    category_2,//二级品类

    1. 最近一个月,销售数量最多的10个商品

    select
        item_id,
        count(order_id)a
    from 
        t_order
    where
        dataediff(create_time,current_date)<=30
    group by 
        item_id
    order by a desc;

    2. 最近一个月,每个种类里销售数量最多的10个商品

    #一个订单对应一个商品 一个商品对应一个品类

    with(
        select
            order_id,
            item_id,
            item_name,
            category
        from
             t_order
        join
            t_item
        on
            t_order.item_id = t_item.item_id
    ) t
    select
        order_id,
        item_id,
        item_name,
        category,
        count(item_id)over(
            partition by category
        )item_count
    from
         t
    group by category
    order by item_count desc
    limit 10;

    计算平台的每一个用户发过多少日记、获得多少点赞数

    with t3 as(
        select * from 
        t1 left join t2 
        on t1.log_id = t2.log_id
    )
    select
        uid,//用户Id
        count(log_id)over(partition by uid)log_cnt,//
        count(like_uid)over(partition by log_id)liked_cnt//获得多少点赞数
    from
        t3

    处理产品版本号

    1、需求A:找出T1表中最大的版本号

    思路:列转行 切割版本号 一列变三列

    主版本号  子版本号 阶段版本号

    with t2 as(//转换
        select
            v_id v1,//版本号
            v_id v2 //from
            t1
        lateral view explode(v2) tmp as v2
    )
    select //第一层 找出第一个
        v1,
        max(v2)
    from 
        t2

    1、需求A:找出T1表中最大的版本号

    select
        v_id,//版本号
        max(split(v_id,".")[0]) v1,//主版本不会为空
        max(if(split(v_id,".")[1]="",0,split(v_id,".")[1]))v2,//取出子版本并判断是否为空,并给默认值
        max(if(split(v_id,".")[2]="",0,split(v_id,".")[2]))v3//取出阶段版本并判断是否为空,并给默认值
    from
        t1

    2、需求B:计算出如下格式的所有版本号排序,要求对于相同的版本号,顺序号并列:

    select
        v_id,
        rank() over(partition by v_id order by v_id)seq
    from
        t1
  • 相关阅读:
    过滤器
    JSTL自定义标签
    EL表达式自定义函数
    和 区别
    JSTL标签
    jsp内置对象
    Java堆、栈和常量池以及相关String的详细讲解(转)
    jsp和servlet学习总结
    JAVA多线程实现的两种方式
    redis示例
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14879264.html
Copyright © 2020-2023  润新知