Sélectionnez l'adversaire le plus commun pour chaque joueur

J'ai une table d'histoire de jeu de joueur qui énumère tous les jeux d'échecs qu'un joueur a joué aux tournois.

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 ) 

Je voudrais créer une vue qui countra le nombre de fois le play_id pour chaque player_id et sélectionnera le plus fréquent pour chaque play_id.

Si une vue est la mauvaise façon de faire cela, alors je suis ouvert aux suggestions!

Veuillez tester le script SQL suivant où j'ai utilisé plusieurs CTE en SQL

Pour countr les jeux pour le joueur pour tous ses matchs, et en comptant pour chaque adversaire, vous pouvez utiliser la fonction SQL COUNT () avec la clause Partition By

Comme dernière étape, pour sélectionner l'adversaire le plus fréquemment joué pour un joueur, nous pouvons utiliser la fonction SQL Row_Number () avec la clause 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