【问题标题】:IMDb Ratings: Keeping only distinct recordsIMDb 评级:只保留不同的记录
【发布时间】:2015-08-24 16:43:53
【问题描述】:

我正在开展一个个人项目,我正在查看一组朋友的 IMDb 电影评分。我正在尝试制作一个包含所有电影及其属性的主维度表。当多人评价一部电影时会有重复,我想获得不同的电影列表。有 4 个属性会根据某人对电影的评分而改变:DateCreated、IMDb_Rating、Genre 和 Votes。如何仅保留包含“最新”数据的行?

下面是正在发生的事情的一个例子:

如您所见,DateCreated 是相同的,但 IMDb_Rating、Genre 和 Votes 在某些行之间是不同的。我的解决方案是保留得票最高的那一行。

在伪代码中,我想我会使用像 RANK() 这样的窗口排名函数,并按 Votes 对每组 MovieID、Title、Director、Runtime 和 DateRelease 进行排名。然后我会创建一个表,其中只返回排名最高的行。

这有意义吗?对代码的任何帮助都会令人难以置信!

【问题讨论】:

  • 与问题完全无关,但您可能希望进一步规范化您的数据库,因为现在您正在存储一堆重复的信息。当然,这完全取决于您,但是以您的方式存储它会导致您的数据库比其他方式增长得更快。

标签: sql sql-server-2012 window-functions


【解决方案1】:
select MovieID, Title, Director, Runtime, DateRelease,
MAX(Votes) as maxvotes
INTO #sometable
from yourtable
group by MovieID, Title, Director, Runtime, DateRelease

MAX 将满足您的需求。然后,您可以使用into 将获得最高票数的行插入到新表中。

另一种解决方案是使用row_number 窗口函数。

select MovieID, Title, Director, Runtime, DateRelease,
IMDb_Rating, DateCreated, Genre
from
(select *, row_number() over(partition by movieid order by votes desc) as rn
 from yourtable) t
where rn = 1;

【讨论】:

  • 感谢您的回复!但是,如何包含与该 max(Votes) 关联的 IMDb_Rating、DateCreated 和 Genre?
  • @Walker..查看修改后的解决方案。
  • 效果很好!谢谢!!
【解决方案2】:
Select <<column names>> 
INTO #sometable
From 
 (select *,
Row_Number() OVER(Partition by MovieID, Title, Director, Runtime, DateRelease Order by Votes Desc) as R_num
from yourtable
 ) Res
Where R_num = 1

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2013-03-06
    • 2014-09-10
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多