最近群里有人问了,有关SQL的面试题。
我SQL也不咋地。
CREATE TABLE user_visit_log(
ds STRING COMMENT’日期 分区字段’,
user_id BIGINT COMMENT’Uin’,
visit_time BIGINT COMMENT’访问时间戳 单位s’,
scene BIGINT COMMENT’进入应用的场景’,
sessionid STRING COMMENT’单次访问会话id’,
appid STRING COMMENT’应用id’
)
CREATE TABLE f_test_d
(
Ftime BIGINT COMMENT’按天分区’,
Id STRING COMMENT’用户id’,
Page BIGINT COMMENT ‘访问官网落地页id’
)
每天千万甚至上亿的记录数,每天会将当天访问官网的数据insert进该表
对于第一题,我联想到leetcode的第N高的薪水的问题,没错第一题最好采用函数的方法,将 N = 10 来作为参数输入
我先给下Leetcode第177题的答案
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N = N-1;
RETURN (
# Write your MySQL query statement below
select ifnull(
(select distinct Salary from Employee
order by Salary desc # 升序排序
limit N,1), # N是索引,返回一个
null)
as SecondHighestSalary
);
END
SELECT appid from user_visit_log order by count(user_id) desc limit 9,1
这样得到第十的app的名字
SELECT user_id, scene,sessionid where appid = (SELECT appid from user_visit_log order by count(user_id) desc limit 9,1) order by visit_time desc limmit 1 group by ds
第二题我们可以来想象一个简单的案例,如果我每天都写博客,每篇博客都有对应的id,然后根据日期来分开每天写的文章,其实很像CSDN,博客园的数据库体系,问题就是来求出我每天写的第一篇文章的id。
CREATE FUNCTION getEarlyPageID(Id INT) RETURNS INT PageID
BEGIN
RETURN (
# Write your MySQL query statement below
select ifnull(
(select distinct Page from f_test_d
order by Page asc # asc 是升序
limit 1
group by Ftime ),
null)
);
END
首先,很遗憾我解决不了如何在10分钟内将数据跑出的问题,我觉得第二题像是搜查,对于搜索肯定用ElasticSearch,后端很少用SQL进行查询。ElasticSearch我也在慢慢啃。