SQL-比较两行和两列

SQL-比较两行和两列,sql,compare,rows,Sql,Compare,Rows,我正在学习SQL,似乎找不到这个练习的答案 练习:对于同一评论员对同一部电影进行了两次评分,第二次评分更高的所有情况,请返回评论员的姓名和电影的标题 我不知道如何比较两行,然后得到更高的评分 这些表的架构是: 电影(中期、片名、年份、导演) 中文:有一部电影的ID号,片名,发行版 一年,一个导演 审阅者(rID,姓名) ID号为rID的审阅者有特定的姓名 评级(rID、mID、stars、评级日期) 中文:影评人里德在某个特定的评级日期给这部电影定了一个mIDa的星级(1-5)。* 到目前为

我正在学习SQL,似乎找不到这个练习的答案

练习:对于同一评论员对同一部电影进行了两次评分,第二次评分更高的所有情况,请返回评论员的姓名和电影的标题

我不知道如何比较两行,然后得到更高的评分

这些表的架构是:

  • 电影(中期、片名、年份、导演) 中文:有一部电影的ID号,片名,发行版 一年,一个导演
  • 审阅者(rID,姓名) ID号为rID的审阅者有特定的姓名
  • 评级(rID、mID、stars、评级日期) 中文:影评人里德在某个特定的评级日期给这部电影定了一个mIDa的星级(1-5)。*
到目前为止,我在论坛上进行了研究:

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)

类似的方法应该有效(它们也是其他方法)

或者,在这种情况下,您可以在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
(使用您的示例数据)

说明:我想你知道连接语法,所以

诀窍是加入评级两次。 然后WHERE部分检查是否存在一条线,其中一个评级(来自同一部电影的同一评论员)的评级日期更大,明星也更多。检查:“第二次给它更高的评级”


然后,我们只需按评论员姓名和电影标题分组(这一部分是为了避免重复,如果我们有3篇评论员,第二篇评论员比第一篇评论员多,第三篇评论员比第二篇评论员多):对于您的示例数据,不需要分组依据,但是…

类似的方法应该有效(它们也是其他方法)

或者,在这种情况下,您可以在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
(使用您的示例数据)

说明:我想你知道连接语法,所以

诀窍是加入评级两次。 然后WHERE部分检查是否存在一条线,其中一个评级(来自同一部电影的同一评论员)的评级日期更大,明星也更多。检查:“第二次给它更高的评级”


然后,我们只需按评论员姓名和电影标题分组(这一部分是为了避免重复,如果我们有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

这就带来了关于这两次审查的信息。您可以从这里完成查询。

首先获取所有审阅两次的审阅者:

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

这就带来了关于这两次审查的信息。您可以从这里完成查询。

您可以使用
分组依据
拥有

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
这将返回任何一部电影,该电影有来自同一个影评人的多个影评,影星数量最多

这是测试的方法


祝你好运。

你可以使用
分组方式
拥有

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
这将返回任何一部电影,该电影有来自同一个影评人的多个影评,影星数量最多

这是测试的方法


祝你好运。

你能在练习中使用
groupby
子句吗?到目前为止,我得到的答案都不适用于我。我正在尝试改变一些事情,并调整它以使其正常工作。但是看起来不太好。这应该是一个简单的练习。哈哈哈。@CesarZapata我打错了,你可以检查编辑过的答案。这是我想出的笨拙的解决方案。但我更喜欢@RaphaëlAlthaus的答案。谢谢大家的支持。选择姓名、来自评论员的标题、电影位置(rid)(从评级r1中选择rid加入评级r2,使用(rid,mid)其中r2.ratingdate>r1.ratingdate和r2.stars>r1.stars)和(mid)in(从评级r1中选择mid加入评级r2,使用(rid,mid)其中r2.ratingdate>r1.ratingdate和r2.stars>r1.stars)你能在练习中使用
groupby
子句吗?到目前为止,我得到的答案都不适用于我。我正在尝试改变一些事情,并调整它以使其正常工作。但是看起来不太好。这应该是一个简单的练习。哈哈哈。@CesarZapata我打错了,你可以检查编辑过的答案。这是我想出的笨拙的解决方案。但我更喜欢@RaphaëlAlthaus的答案。谢谢大家的支持。选择姓名、来自评论员的标题、电影位置(rid)(从评级r1中选择rid加入评级r2,使用(rid,mid)其中r2.ratingdate>r1.ratingdate和r2.stars>r1.stars)和(mid)中(从评级r1中选择mid加入评级r2,使用(rid,mid)其中r2.ratingdate>r1.ratingdate和r2.stars>r1.stars)很好@RaphaëlAlthaus!标题出来,但可以更新时,我回来:)然而,我喜欢你的答案+1拉法·拉特豪斯的好点子!标题出来,但可以更新时,我回来:)然而,我喜欢你的答案+他还是个不工作的人。它应该只返回“莎拉·马丁内斯|乱世佳人”你是他的兄弟。这个很好用。我现在已经找到了另一个解决方案,但它远没有你的好。这是一个相当笨拙的问题。我也会把它贴在这里。非常感谢您的帮助,也感谢您的解释。巴西的问候。塞萨尔斯蒂尔不是工人。它应该只返回“莎拉·马丁内斯|乱世佳人”你是他的兄弟。这个很好用。我现在已经找到了另一个解决方案,但它远没有你的好。这是一个相当笨拙的问题。我也会把它贴在这里。非常感谢您的帮助,也感谢您的解释。巴西的问候。塞萨尔