SQL数据分析面试题

1、现有交易数据表user_goods_table,


image.png

老板想知道每个用户购买的外卖品类偏好分布,并找出每个用户购买最多的外卖品类是哪个。


方法一:

SELECT
   user_name
   ,goods_kind
FROM
   (
   SELECT
       user_name
       ,goods_kind
       ,cn
       ,rank() over( partition by user_name order by cn desc) rn
   FROM
       (
       SELECT
           user_name
           ,goods_kind
           ,count(*) as cn
       FROM user_goods_table
       GROUP BY user_name,goods_kind
       )a
   )b
WHERE b.rn=1
-- 排序可以直接在第一个SELECT里进行,这样就只需要一个子查询了


方法二:

SELECT
    user_name
    ,goods_kind
FROM
    (
    SELECT
        user_name
        ,goods_kind
        ,count(*) as cn
        ,rank() over( partition by user_name order by count(*) desc) rn 
    FROM user_goods_table
    GROUP BY user_name,goods_kind
    )a
WHERE a.rn=1

2、现有交易数据表user_sales_table,


image.png

老板想知道支付金额在前20%的用户。


SELECT
   user_name
   ,pay_amount
   ,nt
FROM
   (
   SELECT
       user_name
       ,pay_amount
       ,ntile(5) over(ORDER BY Cast(pay_amount as SIGNED INT) DESC) nt
   FROM user_sales_table
   )a
WHERE nt=1

3、现有用户登录表user_login_table,


image.png

老板想知道连续7天都登录平台的重要用户。

方法一(先排序,然后相减并进行分组计数):
SELECT
    user_name
    ,DATE_SUB(cast(date as date),interval rn day) ds
    ,count(DATE_SUB(cast(date as date),interval rn day)) ct
FROM
    (
    SELECT
        user_name
        ,date
        ,row_number() over(partition by user_name order by cast(date as date) asc) rn
    FROM user_login_table
    )a
GROUP BY user_name,ds
HAVING count(DATE_SUB(cast(date as date),interval rn day))>=7


方法二(使用lead函数进行偏移计算,然后使用date_sub或date_add进行日期加减作为筛选条件):

SELECT
   DISTINCT user_name
FROM
   (
   SELECT
       user_name
       ,date
       ,LEAD(date,6) OVER(partition by user_name order by cast(date as date) asc) lead_date

   FROM user_login_table
   )a
WHERE date_add(cast(date as date),interval 6 day)=cast(lead_date as date)

4、给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】,日期:【date】,是否签到:【is_sign_in】,0否1是。

4-1、计算截至当前(假设当前时间为2020-04-27),每个用户已经连续签到的天数:

要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】

先计算最近一次没有签到的日期,然后用最近的日期减去最近一次没有签到的日期,就可以得到最近连续签到的天数
SELECT
    userid
    ,MAX(date)
    ,datediff("2020-04-27",MAX(date)) recent_continuous_days
FROM user_attendence
WHERE is_sign=0
GROUP BY userid

4-2、计算有史以来用户最大连续签到天数

要求输出用户ID【user_id】和最大连续签到天数


方法一(先进行排序,然后使用日期与排序相减并对相减之后的日期进行分组排序计数,就可以得出连续登录的次数,然后再进行排序取最大值):

SELECT
    userid
    ,ct
FROM
    (
    SELECT
        userid
        ,DATE_SUB(date,INTERVAL rn day) ds
        ,COUNT(DATE_SUB(date,INTERVAL rn day)) ct  -- count括号里可以直接用*代替
        ,rank() over(PARTITION by userid ORDER BY COUNT(DATE_SUB(date,INTERVAL rn day)) DESC) rn   
        -- 这个可以不用窗口函数,直接在外面使用MAX(COUNT(*))就可以取得最大值
    FROM
        (
        SELECT
            userid
            ,date
            ,row_number() over(partition by userid order by date asc ) rn
        FROM user_attendence
        WHERE is_sign=1
        )a
    GROUP BY userid,ds
    )b
WHERE rn=1


方法二((先进行排序,然后使用日期与排序相减并对相减之后的日期进行分组排序计数,就可以得出连续登录的次数,然后直接用MAX函数取最大值):

SELECT b.userid
        , MAX(b.continues_day) as max_continuous_days
FROM 
    (SELECT 
         a.userid
          , a.date-a.rn AS difference
          , COUNT(*) AS continues_day
      FROM 
      (SELECT 
           userid,
           date, 
           ROW_NUMBER() OVER (PARTITION BY userid ORDER BY date) AS rn
        FROM user_attendence
        WHERE is_sign = 1) AS a
      GROUP BY a.userid, difference
     ) AS b
GROUP BY b.userid

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容