2016-06-09 27 views
1

我有一个玩家游戏历史表,列出了玩家在比赛中玩过的所有象棋游戏。为每个玩家选择最常见的对手

CREATE TABLE [dbo].[cub_player_hist](
    [id] [int] NOT NULL, 
    [player_id] [int] NULL, --Player's ID 
    [Event_Title] [nvarchar](100) NULL, 
    [Event_id] [int] NULL, 
    [Event_Start] [smalldatetime] NULL, 
    [FullName] [nvarchar](max) NULL, -- Player's Name 
    [Result_txt] [varchar](9) NULL, 
    [result] [int] NULL, 
    [played_id] [int] NULL, -- Opponent's ID 
    [Played] [nvarchar](max) NULL, -- Opponent's Name 
CONSTRAINT [cub_player_hist_pk] PRIMARY KEY CLUSTERED 
) 

我想创建一个视图,将计数的次数每个player_id的played_id并选择最频繁出现的每个played_id。

如果一个视图是错误的方式去了解这一点,那么我愿意提供建议!

+0

你有没有考虑正常化cub_player_hist? 也许你不允许 - 但是如果你可以那么下面的表格(假设多对可以在一个事件中玩) - 玩家 - 事件 - 匹配 – BIDeveloper

回答

1

请测试以下是我过去multiple-CTE in SQL

计数游戏玩家对他/她的所有比赛,并为每个对手计数SQL脚本,您可以使用SQL COUNT() function with Partition By clause

在最后一步,我们可以使用SQL Row_Number() function with Partition By子句

;with cte as 
(
    select *, 
     COUNT(*) over (partition by player_id) cnt_all, 
     COUNT(*) over (partition by player_id, played_id) cnt_opp 
    from [dbo].[cub_player_hist] 
), cte2 as (
    select 
     *, ROW_NUMBER() over (partition by player_id order by cnt_opp desc) rn 
    from cte 
) 
select 
    player_id, 
    fullname player_name, 
    played_id, 
    played opponent_name 
from cte2 
where rn = 1 
order by player_id