编辑
2023-10-18
英语学习
00
请注意,本文编写于 570 天前,最后修改于 570 天前,其中某些信息可能已经过时。

目录

窗口函数。

image.png

image.png

image.png

sql
CREATE TABLE Movies ( movie_id INT PRIMARY KEY, title VARCHAR(100) ); CREATE TABLE Users ( user_id INT PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE MovieRating ( movie_id INT, user_id INT, rating INT, created_at DATE, PRIMARY KEY (movie_id, user_id) ); drop table Movies; INSERT INTO Movies (movie_id, title) VALUES (1, 'Avengers'), (2, 'Frozen 2'), (3, 'Joker'); INSERT INTO Users (user_id, name) VALUES (1, 'Daniel'), (2, 'Monica'), (3, 'Maria'), (4, 'James'); INSERT INTO MovieRating (movie_id, user_id, rating, created_at) VALUES (1, 1, 3, '2020-01-12'), (1, 2, 4, '2020-02-11'), (1, 3, 2, '2020-02-12'), (1, 4, 1, '2020-01-01'), (2, 1, 5, '2020-02-17'), (2, 2, 2, '2020-02-01'), (2, 3, 2, '2020-03-01'), (3, 1, 3, '2020-02-22'), (3, 2, 4, '2020-02-25'); select r1.results from ( select u.name as results from Users as u left join MovieRating as m on u.user_id=m.user_id group by u.user_id,u.name order by count(u.user_id) desc,u.name asc limit 1 ) as r1 union all select r2.results from ( select m2.title as results from Movies as m2 left join MovieRating as m on m.movie_id=m2.movie_id and m.created_at like '2020-02%' group by m2.title order by avg(m.rating) desc,m2.title asc limit 1 ) r2; -- 查找评论电影数量最多的用户名 SELECT u.name AS results FROM Users u JOIN (SELECT user_id, COUNT(DISTINCT movie_id) AS num_movies FROM MovieRating GROUP BY user_id HAVING num_movies = (SELECT MAX(num_movies) FROM (SELECT COUNT(DISTINCT movie_id) AS num_movies FROM MovieRating GROUP BY user_id) t)) m ON u.user_id = m.user_id ORDER BY u.name LIMIT 1; SELECT m.title AS results FROM Movies m JOIN ( SELECT movie_id, AVG(rating) AS avg_rating FROM MovieRating WHERE created_at >= '2020-02-01' AND created_at < '2020-03-01' GROUP BY movie_id HAVING avg_rating = ( SELECT MAX(avg_rating) FROM ( SELECT movie_id, AVG(rating) AS avg_rating FROM MovieRating WHERE created_at >= '2020-02-01' AND created_at < '2020-03-01' GROUP BY movie_id ) t ) ) r ON m.movie_id = r.movie_id ORDER BY m.title LIMIT 1; SELECT results FROM ( SELECT name AS results, RANK() OVER(ORDER BY COUNT(*) DESC, name) AS RANKING FROM Users INNER JOIN MovieRating USING(user_id) GROUP BY user_id UNION ALL SELECT title AS results, RANK() OVER(ORDER BY AVG(rating) DESC, title) AS RANKING FROM MovieRating INNER JOIN Movies USING(movie_id) WHERE DATE_FORMAT(created_at, '%Y-%m') = '2020-02' GROUP BY movie_id ) T WHERE T.RANKING = 1

窗口函数。

第一个子查询选择的是评论电影数量最多的用户名。通过内连接(INNER JOIN)Users和MovieRating表,使用user_id进行连接,并使用GROUP BY对user_id进行分组。然后使用RANK() OVER进行排名,根据评论数量降序排列,并根据用户名的字典序升序排列(如果评论数量相同)。 第二个子查询选择的是在2020年2月份平均评分最高的电影名称。通过内连接Movies和MovieRating表,使用movie_id进行连接,并使用WHERE子句筛选出2020年2月份的数据。然后使用GROUP BY对movie_id进行分组,计算平均评分。再使用RANK() OVER进行排名,根据平均评分降序排列,并根据电影名称的字典序升序排列(如果平均评分相同)。

image.png

image.png

sql
CREATE TABLE Employees ( id INT PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE EmployeeUNI ( id INT, unique_id INT, PRIMARY KEY (id, unique_id) ); INSERT INTO Employees (id, name) VALUES (1, 'Alice'), (7, 'Bob'), (11, 'Meir'), (90, 'Winston'), (3, 'Jonathan'); INSERT INTO EmployeeUNI (id, unique_id) VALUES (3, 1), (11, 2), (90, 3); select unique_id,name from Employees as e1 left join EmployeeUNI as e2 on e1.id=e2.id ;

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!