📣 独立日限时特惠: VIP通行证立减$68
查看: 1425| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 问一道数据库sql题。

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 ycclll942 于 2021-2-8 10:12 编辑

假设有按时间分组的用户表和视频表共四表(t1:202101 用户表,t2:202101:视频表,t3:202102 用户表,t4:202102视频表)
t1,t3:记录了id,时间,用户姓名和国家
t2,t4:记录了id,时间和历史视屏播放总量
现在求202101~202102中视频播放量前5,来自中国的用户。

我的想法是,先将视频表和用户表 left join 得到,来自中国的用户和历史播放量(t5,t6临时表),再将两个临时表full join合并,使用播放总量做差,再排序?

不知道这个思路对不?
求各位指教!

上一篇:本人在美国,打算全职刷题,寻找小伙伴一起
下一篇:JS为啥需要Symbol这个类型
全局:
不知道我有没有理解对。
1. 把t1和t3弄成一个表, t2和t4弄成一张表。 这样你就只有两张表。
2. 然后直接 TOP 5 播放总量 where 用户来自中国。
回复

使用道具 举报

🔗
 楼主| ycclll942 2021-2-8 10:20:44 | 只看该作者
全局:
  1. SELECT
  2.   count02 - count01 AS totalplay,
  3.   x.author_id,
  4.   name
  5. from(
  6.     SELECT
  7.       count02,
  8.       author_id,
  9.       name
  10.     from(
  11.         SELECT
  12.           play_count AS count02,
  13.           author_id
  14.         FROM
  15.           video m
  16.         WHERE
  17.           m.time = '202102'
  18.       ) a
  19.       LEFT JOIN (
  20.         SELECT
  21.           author_id,
  22.           name
  23.         FROM
  24.           personal n
  25.         WHERE
  26.           region = 'CN'
  27.           AND time = '202102'
  28.       ) b ON a.author_id = b.author_id
  29.   ) x FULL
  30.   JOIN (
  31.     SELECT
  32.       count01,
  33.       author_id,
  34.       name
  35.     from(
  36.         SELECT
  37.           play_count AS count01,
  38.           author_id
  39.         FROM
  40.           video m
  41.         WHERE
  42.           time = '202101'
  43.       ) aa
  44.       left join(
  45.         SELECT
  46.           author_id,
  47.           name
  48.         FROM
  49.           personal n
  50.         WHERE
  51.           region = 'CN'
  52.           AND time = '202101'
  53.       ) bb ON aa.author_id = bb.author_id
  54.   ) y ON x.author_id = y.author_id
  55. ORDER BY
  56.   totalplay DESC
  57. LIMIT
  58.   5
复制代码
回复

使用道具 举报

🔗
 楼主| ycclll942 2021-2-8 10:21:06 | 只看该作者
全局:
ycclll942 发表于 2021-2-8 10:20
[mw_shl_code=sql,true]SELECT
  count02 - count01 AS totalplay,
  x.author_id,

大概是我的现在的一个想法
回复

使用道具 举报

🔗
still602 2021-2-8 10:44:04 | 只看该作者
全局:
不知道是不是我没有理解你的题意,我着实没看懂为什么你要把t5和t6 full join之后再做差。。。
如果t5和t6只有时间上的差别,为什么不直接union all把这两个临时表纵向合并再filter?
回复

使用道具 举报

🔗
 楼主| ycclll942 2021-2-10 10:05:56 | 只看该作者
全局:
沉默的小马 发表于 2021-2-9 00:49
不知道我有没有理解对。
1. 把t1和t3弄成一个表, t2和t4弄成一张表。 这样你就只有两张表。
2. 然后直接 ...

对 我是这样的想法
回复

使用道具 举报

🔗
sandra0507 2021-2-10 14:27:58 | 只看该作者
全局:
把1 3 union all 之后 再跟2 4 的union all 来join 好像就可以了啊
回复

使用道具 举报

🔗
jinink 2021-2-11 11:42:41 | 只看该作者
全局:
最近在刷SQL题,试着写了一下,不知道对不对 ><

  1. WITH CTE AS (
  2.     SELECT * FROM t1
  3.     UNION ALL
  4.     SELECT * FROM t3
  5.     ORDER BY author_id
  6. )
  7. SELECT CTE.author_id, name, region, play_count
  8. FROM CTE
  9. LEFT JOIN t2
  10.     ON CTE.author_id = t2.author_id
  11.     AND CTE.time = t2.time
  12. LEFT JOIN t4
  13.     ON CTE.author_id = t4.author_id
  14.     AND CTE.time = t4.time
  15. WHERE region = 'CN'
  16. ORDER BY play_count DESC
  17. LIMIT 5;
复制代码
回复

使用道具 举报

🔗
cattyjean 2021-2-15 00:49:26 | 只看该作者
全局:
这题就是常见题型。可参见department top 3 salaries. https://leetcode.com/problems/department-top-three-salaries/
前期你table处理好后,要么用dense_rank 要么就是常见的self-join (where xxx < 5)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表