[英]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.