使用集合论而非游标的SQL排名

时间:2018-07-08 12:15:13

标签: sql-server tsql

我设法整合了来自不同来源的数据,以期根据世界各地的观看情况来制作电影排名。在理想的情况下,我的数据非常完整,以至于排名很容易,但是我只能继续自己拥有的东西。当我查看数据时,我通过眼球知道如何使计算机完成我的眼睛如何对影片进行评级,但这是以光标的方式进行的,无论如何都要进行编码。理想情况下,我想使用SQL,应该使用Set理论。有谁知道我该怎么做吗?

基于国家/地区订购表的目测方法。

我看到在澳大利亚(悉尼)有4部电影被评级,所以这是我的出发点,最佳电影是《女人的香气》,《敢死队》,然后是好丑,然后硬死。然后我看比利时,发现《善意狩猎》和《杀死比尔》在澳大利亚都没有评级,所以我把它们放在一边,然后转到法国和巴黎。在这里,我看到《好坏丑陋》在澳大利亚排名第一,在第三名,所以我知道《第一接触》和《善意狩猎》的评分与《虎胆龙威》处于同一水平。...直到我能从其他国家看到《虎胆龙威》很难将其与善意狩猎和消耗品进行比较。。。。。。。

O,“排名”字段是排名,“总排名”是按城市为一个国家排名的电影数量。...

enter image description here

这是一个棘手的问题,已经在我脑海中浮现了几天。...

CREATE TABLE [dbo].[QuestionToAsk2]
(
    [ranking] [bigint] NULL,
    [totalrank] [bigint] NULL,
    [Film] [varchar](50) NULL,
    [Country] [varchar](255) NULL,
    [City] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT [dbo].[QuestionToAsk2] ([ranking], [totalrank], [Film], [Country], 
[City]) 
VALUES (1, 2, N'***First Contact', N'***UK', N'Manchester'),
       (2, 2, N'***Dumb And Dumber', N'***UK', N'Manchester'),
       (1, 3, N'***Shawshank Redemption', N'***Germany', N'Munich'),
       (2, 3, N'***The Expendibles', N'***Germany', N'Munich'),
       (3, 3, N'***The Notebook', N'***Germany', N'Munich'),
       (1, 2, N'***Kill Bill', N'***Germany', N'Hamburg'),
       (2, 2, N'***King Arthur', N'***Germany', N'Hamburg'),
       (1, 2, N'***Good Will Hunting', N'***Belgium', N'Brussels'),
       (2, 2, N'***Kill Bill', N'***Belgium', N'Brussels'),
       (1, 5, N'***First Contact', N'***Russia', N'Moscow'),
       (2, 5, N'***Good Will Hunting', N'***Russia', N'Moscow'),
       (3, 5, N'***Scent Of A Woman', N'***Russia', N'Moscow'),
       (4, 5, N'***Sea Of Love', N'***Russia', N'Moscow'),
       (1, 3, N'***The Godfather part 3', N'***Japan', N'Tokyo'),
       (2, 3, N'***Scent Of A Woman', N'***Japan', N'Tokyo'),
       (3, 3, N'***Sea Of Love', N'***Japan', N'Tokyo'),
       (1, 2, N'***Star Wars Episode IV', N'***Portugal', N'Porto'),
       (2, 2, N'***First Contact', N'***Portugal', N'Porto'),
       (1, 2, N'***Star Wars Episode IV', N'***USA', N'Boston'),
       (2, 2, N'***Revenge Of The Sith', N'***USA', N'Boston'),
       (1, 2, N'***Good Will Hunting', N'***Italy', N'Rome'),
       (2, 2, N'***Sea Of Love', N'***Italy', N'Rome'),
       (1, 4, N'***Scent Of A Woman', N'***Australia', N'Sydney'),
       (2, 4, N'***The Expendibles', N'***Australia', N'Sydney'),
       (3, 4, N'***The Good The Bad and The Ugly', N'***Australia', N'Sydney'),
       (4, 4, N'***Die Hard', N'***Australia', N'Sydney'),
       (1, 2, N'***Kill Bill', N'***Switzerland', N'Geneva'),
       (2, 2, N'***King Arthur', N'***Switzerland', N'Geneva'),
       (1, 4, N'***Scent Of A Woman', N'***UK', N'London'),
       (2, 4, N'***Shawshank Redemption', N'***UK', N'London'),
       (3, 4, N'***Die Hard', N'***UK', N'London'),
       (4, 4, N'***The Notebook', N'***UK', N'London'),
       (1, 3, N'***The Good The Bad and The Ugly', N'***France', N'Paris'),
       (2, 3, N'***First Contact', N'***France', N'Paris'),
       (3, 3, N'***Good Will Hunting', N'***France', N'Paris'),
       (1, 3, N'***First Contact', N'***Spain', N'Madrid'),
       (2, 3, N'***Good Will Hunting', N'***Spain', N'Madrid'),
       (3, 3, N'***The Good The Bad and The Ugly', N'***Spain', N'Madrid'),
       (1, 2, N'***Shawshank Redemption', N'***Poland', N'Warsaw'),
       (2, 2, N'***Good Will Hunting', N'***Poland', N'Warsaw'),
       (1, 2, N'***Scent Of A Woman', N'***Slovakia', N'Poprad'),
       (2, 2, N'***Shawshank Redemption', N'***Slovakia', N'Poprad'),
       (1, 3, N'***The Notebook', N'***Slovakia', N'Kosice'),
       (2, 3, N'***Sea Of Love', N'***Slovakia', N'Kosice'),
       (3, 3, N'***Shawshank Redemption', N'***Slovakia', N'Kosice'),
       (1, 3, N'***First Contact', N'***France', N'Cannes'),
       (2, 3, N'***Dumb And Dumber', N'***France', N'Cannes'),
       (3, 3, N'***Shawshank Redemption', N'***France', N'Cannes'),
       (1, 3, N'***Scent Of A Woman', N'***USA', N'New York'),
       (2, 3, N'***Star Wars Episode IV', N'***USA', N'New York'),
       (3, 3, N'***Revenge Of The Sith', N'***USA', N'New York'),
       (1, 2, N'***Star Wars Episode IV', N'***Slovakia', N'Bratislava'),
       (2, 2, N'***The Notebook', N'***Slovakia', N'Bratislava'),
       (1, 2, N'***Scent Of A Woman', N'***Portugal', N'Lisbon'),
       (2, 2, N'***Die Hard', N'***Portugal', N'Lisbon');

1 个答案:

答案 0 :(得分:0)

如果我理解您的问题,就应该这样做。我已经重新创建了您的一些数据,但添加了一个虚构的电影评分栏,因此我们确实有必要进行排名。

CREATE TABLE #QuestionToAsk2
(
    [Film] [varchar](50) NULL,
    [Country] [varchar](255) NULL,
    [City] [varchar](50) NULL,
    [FilmRating] int
) 
GO

INSERT into #QuestionToAsk2 ([Film], [Country], [City], [FilmRating]) 
VALUES (N'***First Contact', N'***UK', N'Manchester', 9),
       (N'***Dumb And Dumber', N'***UK', N'Manchester', 10),
       (N'***Shawshank Redemption', N'***Germany', N'Munich', 7),
       (N'***The Expendibles', N'***Germany', N'Munich', 4),
       (N'***The Notebook', N'***Germany', N'Munich', 2),
       (N'***Kill Bill', N'***Germany', N'Hamburg', 6),
       (N'***King Arthur', N'***Germany', N'Hamburg', 5),
       (N'***Good Will Hunting', N'***Belgium', N'Brussels', 3),
       (N'***Kill Bill', N'***Belgium', N'Brussels', 5)


select 
 rank() over(partition by city order by [FilmRating] desc) [Rank]
,count(*) over(partition by City) [TotalRank]
,film
,Country
,City
,[FilmRating]
from #QuestionToAsk2 a

这将产生:

Output