常见大厂面试题(SQL)01

知乎问答最大连续回答问题天数大于等于3天的用户及其对应等级

1.描述

现有某乎问答创作者信息表author_tb如下(其中author_id表示创作者编号、author_level表示创作者级别,共1-6六个级别、sex表示创作者性别):

author_id   

author_level

sex

101

6

m

102

1

f

103

1

m

104

3

m

105

4

f

106

2

f

107

2

m

108

5

f

109

6

f

110

5

m

创作者回答情况表answer_tb如下(其中answer_date表示创作日期、author_id指创作者编号、issue_id指回答问题编号、char_len表示回答字数):

answer_date

author_id

issue_id

char_len

2023-11-01

101

E001

150

2023-11-01

101

E002

200

2023-11-01

102

C003

50

2023-11-01

103

P001

35

2023-11-01

104

C003

120

2023-11-01

105

P001

125

2023-11-01

102

P002

105

2023-11-02

101

P001

201

2023-11-02

110

C002

200

2023-11-02

110

C001

225

2023-11-02

110

C002

220

2023-11-03

101

C002

180

2023-11-04

109

E003

130

2023-11-04

109

E001

123

2023-11-05

108

C001

160

2023-11-05

108

C002

120

2023-11-05

110

P001

180

2023-11-05

106

P002

45

2023-11-05

107

E003

56

请你统计最大连续回答问题的天数大于等于3天的用户及其等级(若有多条符合条件的数据,按author_id升序排序),以上例子的输出结果如下:

author_id

author_level

days_cnt

101

6

3

数据导入

drop database if exists db_1;
create database db_1;
use db_1;

drop table if exists author_tb;
CREATE TABLE author_tb
(
    author_id    int(10) NOT NULL,
    author_level int(10) NOT NULL,
    sex          char(10) NOT NULL
);
INSERT INTO author_tb   
VALUES 
    (101, 6, 'm'),
    (102, 1, 'f'),
    (103, 1, 'm'),
    (104, 3, 'm'),
    (105, 4, 'f'),
    (106, 2, 'f'),
    (107, 2, 'm'),
    (108, 5, 'f'),
    (109, 6, 'f'),
    (110, 5, 'm');

drop table if exists answer_tb;
CREATE TABLE answer_tb
(
    answer_date date     NOT NULL,
    author_id   int(10) NOT NULL,
    issue_id    char(10) NOT NULL,
    char_len    int(10) NOT NULL
);

INSERT INTO answer_tb
VALUES 
    ('2021-11-1', 101, 'E001', 150),
    ('2021-11-1', 101, 'E002', 200),
    ('2021-11-1', 102, 'C003', 50),
    ('2021-11-1', 103, 'P001', 35),
    ('2021-11-1', 104, 'C003', 120),
    ('2021-11-1', 105, 'P001', 125),
    ('2021-11-1', 102, 'P002', 105),
    ('2021-11-2', 101, 'P001', 201),
    ('2021-11-2', 110, 'C002', 200),
    ('2021-11-2', 110, 'C001', 225),
    ('2021-11-2', 110, 'C002', 220),
    ('2021-11-3', 101, 'C002', 180),
    ('2021-11-4', 109, 'E003', 130),
    ('2021-11-4', 109, 'E001', 123),
    ('2021-11-5', 108, 'C001', 160),
    ('2021-11-5', 108, 'C002', 120),
    ('2021-11-5', 110, 'P001', 180),
    ('2021-11-5', 106, 'P002', 45),
    ('2021-11-5', 107, 'E003', 56);

select * from author_tb;

select * from answer_tb;

解题思路

实现代码

with t1 as (
    -- 1 去重
    select
        author_id,
        answer_date,
        -- 2 排名
        row_number() over (partition by author_id order by answer_date) as rn,
        -- 3 差值 = 日期 - 排名
        date_sub(answer_date, interval (row_number() over (partition by author_id order by answer_date)) day) as diff
    from answer_tb
    group by answer_date, author_id
)
select
    author_id,
    (select t2.author_level from author_tb t2 where t2.author_id=t1.author_id) author_level,
    count(1) days
from t1
group by author_id, diff
having count(1)>=3
order by author_id asc
;

相关推荐

  1. NIUKE SQL大厂面试(四) 【某滴打车】

    2024-04-24 13:16:03       10 阅读
  2. NIUKE SQL大厂面试(三) 【某东商城】

    2024-04-24 13:16:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-24 13:16:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-24 13:16:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-24 13:16:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-24 13:16:03       20 阅读

热门阅读

  1. (一)Mysql创建一个博客相关的数据库

    2024-04-24 13:16:03       16 阅读
  2. springboot项目打war包,并且部署外部tomcat中

    2024-04-24 13:16:03       19 阅读
  3. 【Redis】Spring Boot应用中的Redis分布式锁示例

    2024-04-24 13:16:03       13 阅读
  4. windows、Mac如何安装vue开发环境?

    2024-04-24 13:16:03       14 阅读
  5. 在Linux上开启FTP服务

    2024-04-24 13:16:03       15 阅读
  6. LeetCode 344.反转字符串

    2024-04-24 13:16:03       15 阅读
  7. 多服务器上的 docker 实现互相访问

    2024-04-24 13:16:03       16 阅读
  8. React vs React Native写法上的不同

    2024-04-24 13:16:03       14 阅读