zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    973. K Closest Points to Origin
    919. Complete Binary Tree Inserter
    993. Cousins in Binary Tree
    20. Valid Parentheses
    141. Linked List Cycle
    912. Sort an Array
    各种排序方法总结
    509. Fibonacci Number
    374. Guess Number Higher or Lower
    238. Product of Array Except Self java solutions
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14879264.html
Copyright © 2011-2022 走看看