[英]SQL - Comparing two rows and two columns
我正在研究SQL,但似乎找不到此练习的答案。
练习:对于同一位审阅者两次对同一部电影进行评级并第二次给予更高评级的所有情况,请返回审阅者的姓名和电影标题。
我不知道如何比较2行,然后获得更高的评分。
表的架构为:
到目前为止,我已经在论坛上进行了研究:
select *
from rating a
join Reviewer rv on rv.rid = a.rid
where 1 < (select COUNT(*) from rating b
where b.rid = a.rid and b.mid = a.mid)
我很高兴能得到代码的解释。 因为即使上面的代码也让我非常困惑。
/* Create the schema for our tables */
create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text);
create table Rating(rID int, mID int, stars int, ratingDate date);
/* Populate the tables with our data */
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming');
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas');
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise');
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg');
insert into Movie values(105, 'Titanic', 1997, 'James Cameron');
insert into Movie values(106, 'Snow White', 1937, null);
insert into Movie values(107, 'Avatar', 2009, 'James Cameron');
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg');
insert into Reviewer values(201, 'Sarah Martinez');
insert into Reviewer values(202, 'Daniel Lewis');
insert into Reviewer values(203, 'Brittany Harris');
insert into Reviewer values(204, 'Mike Anderson');
insert into Reviewer values(205, 'Chris Jackson');
insert into Reviewer values(206, 'Elizabeth Thomas');
insert into Reviewer values(207, 'James Cameron');
insert into Reviewer values(208, 'Ashley White');
insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');
像这样的东西应该起作用(它们也有其他方式)
SELECT rev.name, m.title
FROM Reviewer rev
INNER JOIN Rating r1 on r1.rID = rev.rID
INNER JOIN Rating r2 on r2.rID = rev.rID and r2.mID = r1.mID
INNER JOIN Movie m on m.mID = r1.mID
WHERE r2.ratingDate > r1.ratingDate and r2.stars > r1.stars
或者在这种情况下,您可以全部执行join(而不是WHERE子句)
SELECT rev.name, m.title
FROM Reviewer rev
INNER JOIN Rating r1 on r1.rID = rev.rID
INNER JOIN Rating r2
on r2.rID = rev.rID
and r2.mID = r1.mID
and r2.ratingDate > r1.ratingDate
and r2.stars > r1.stars
INNER JOIN Movie m on m.mID = r1.mID
SqlFiddle (带有您的示例数据)
说明:我想您知道JOIN语法,所以
诀窍是两次加入Rating。 然后,WHERE部分检查是否存在一行,其中一个评分(来自同一电影的同一位审阅者)具有一个更大的ratingDate和更多的星星。 哪个检查:“第二次给它更高的评价”。
然后,我们仅按reviewerName和电影标题进行分组(如果我们有3条评论,则该部分是避免重复,第二条具有比第一条更多的星星,第三条比第二条更多的星星):使用您的示例数据,需要,但是...
首先让所有审阅过两次的审稿人开始:
select rid
from rating r
group by rid
having count(*) = 2
现在的问题是:它们是相同的还是第二个更大? 为此,请重新加入评分,但还要包括两个日期:
from (select rid, min(ratingdate) as minratingdate, max(ratingdate) as maxratingdate
from rating r
group by rid
having count(*) = 2
) twotimes join
rating r1
on r1.rid = twotimes.rid and r1.ratingdate = twotimes.minratingdate join
rating r2
on r2.rid = twotimes.rid and r2.ratingdate = twotimes.maxratingdate
这带来了有关两个评论的信息。 您可以从这里完成查询。
您可以使用GROUP BY
和HAVING
:
SELECT m.mId, m.Title, r.Name, ra.stars
FROM Movie m
JOIN (SELECT mId, rId, MAX(stars) stars
FROM Rating
GROUP BY mId, rId
HAVING COUNT(*) > 1) ra ON m.mId = ra.mId
JOIN Reviewer r ON ra.rId = r.rId
GROUP BY m.mId, m.Title, r.Name, ra.stars
这将为您返回具有来自同一评论者的最高星数的多个评论的电影。
这是用于测试的SQL Fiddle 。
祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.