0% found this document useful (0 votes)
11 views

SQL Project

The document contains SQL queries to analyze game data and extract insights. It includes queries to find player details by level and difficulty, average kill counts by level and device, total stages completed by difficulty, and more. Window functions are used extensively to calculate aggregations and rankings over the data.

Uploaded by

Shuvo Khan
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views

SQL Project

The document contains SQL queries to analyze game data and extract insights. It includes queries to find player details by level and difficulty, average kill counts by level and device, total stages completed by difficulty, and more. Window functions are used extensively to calculate aggregations and rankings over the data.

Uploaded by

Shuvo Khan
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

Game Analysis Project

-- Q1) Extract P_ID,Dev_ID,PName and Difficulty_level of all players


-- at level 0
select l.P_ID,l.Dev_ID,p.PName,l.Difficulty
from player_details p
join level_details2 l
on p.P_ID=l.P_ID
where l.Level = 0
order by p.P_ID desc

-- Q2) Find Level1_code wise Avg_Kill_Count where lives_earned is 2 and atleast


-- 3 stages are crossed
select p.L1_Code,AVG(l.Kill_Count) AS Avg_Kills
from player_details p
join level_details2 l
on p.P_ID=l.P_ID
where l.Lives_Earned=2 and l.Stages_crossed >=3
group by p.L1_Code

-- Q3) Find the total number of stages crossed at each diffuculty level
-- where for Level2 with players use zm_series devices. Arrange the result
-- in decsreasing order of total number of stages crossed.
select Difficulty as Diff_Level,count(Stages_crossed) as Total_Stages
from level_details2
where Level=2 and Dev_ID like 'zm%'
group by Difficulty
order by Total_Stages desc
-- Q4) Extract P_ID and the total number of unique dates for those players
-- who have played games on multiple days.
select P_ID, count(distinct(Start_datetime)) as Unique_Dates
from level_details2
group by P_ID
HAVing count(distinct(Start_datetime)) > 1
order by Unique_Dates desc

-- Q5) Find P_ID and level wise sum of kill_counts where kill_count
-- is greater than avg kill count for the Medium difficulty.
select P_ID,Level,Sum(Kill_Count) as Total,AVG(Kill_Count) AS Avg_Kills
from level_details2
where Difficulty='Medium'
group by P_ID,Level
having Sum(Kill_Count)>AVG(Kill_Count)
order by Level desc

-- Q6) Find Level and its corresponding Level code wise sum of lives earned
-- excluding level 0. Arrange in asecending order of level.
select l.Level,p.L1_Code,p.L1_Code,SUM(l.Lives_Earned) over (order by l.Level) as
totallives
from player_details p
join level_details2 l
on p.P_ID=l.P_ID
where l.Level<>0

-- Q7) Find Top 3 score based on each dev_id and Rank them in increasing order
-- using Row_Number. Display difficulty as well.
--‫هنا انا قسمت كل قسم خاص لالي دي ورتبت كل صف جواه علي االسكور‬
SELECT Score,Dev_ID,ROW_NUMBER() over (partition by Dev_ID order by Score) as rownum
from level_details2
--‫رتبت كل صف باالسكور بتاعه‬
SELECT Score,Dev_ID,RANK() over (order by Score) as Rank,
DENSE_RANK() over (order by Score) as rownum
from level_details2

select top 3 Dev_ID,Score,Difficulty,


RANK() over (partition by Dev_ID order by Score) as Rank,
DENSE_RANK() over (partition by Dev_ID order by Score) as DENCERank,
ROW_NUMBER() over (partition by Dev_ID order by Score) as rownum
from level_details2

-- Q8) Find first_login datetime for each device id


SELECT l.Dev_ID, MIN(l.start_datetime) AS first_login_datetime
FROM level_details2 l
JOIN player_details p ON p.P_ID = l.P_ID
GROUP BY l.Dev_ID;

-- Q9) Find Top 5 score based on each difficulty level and Rank them in
-- increasing order using Rank. Display dev_id as well.
select top 5 Dev_ID,Score,Difficulty,
RANK() over (partition by Difficulty order by Score) as Rank,
DENSE_RANK() over (partition by Difficulty order by Score) as DENCERank,
ROW_NUMBER() over (partition by Difficulty order by Score) as rownum
from level_details2

-- Q10) Find the device ID that is first logged in(based on start_datetime)


-- for each player(p_id). Output should contain player id, device id and
-- first login datetime.
SELECT p.P_ID,p.PName,l.Dev_ID, MIN(l.start_datetime)over(partition by p.P_ID) AS
first_login_datetime
from player_details p
join level_details2 l on p.P_ID=l.P_ID
-- Q11) For each player and date, how many kill_count played so far by the player. That
is, the total number of games played -- by the player until that date.
-- a) window function
SELECT P.PName, L.start_datetime,
SUM(L.kill_count) OVER (PARTITION BY P.P_ID ORDER BY L.start_datetime) AS TOTAL_Games,
DENSE_RANK() OVER (PARTITION BY P.P_ID ORDER BY L.start_datetime) AS Rank
FROM player_details P
JOIN level_details2 L ON P.P_ID = L.P_ID

-- b) without window function


select P.PName,L.start_datetime,sum(L.kill_count) AS TOTAL_Games
from player_details p
join level_details2 l
on p.P_ID=l.P_ID
group by P.PName,L.start_datetime
order by TOTAL_Games

-- Q12) Find the cumulative sum of stages crossed over a start_datetime


SELECT start_datetime, SUM(Stages_crossed) OVER (ORDER BY start_datetime) AS
cumulative_stages
FROM level_details2;
-- Q13) Find the cumulative sum of an stages crossed over a start_datetime
-- for each player id but exclude the most recent start_datetime
WITH RankedLevels AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY P_ID ORDER BY start_datetime DESC) AS rn
FROM level_details2
)
SELECT P_ID, start_datetime,
SUM(Stages_crossed) OVER (PARTITION BY P_ID ORDER BY start_datetime ROWS BETWEEN
UNBOUNDED PRECEDING AND 1 PRECEDING) AS total_stages
FROM RankedLevels
WHERE rn > 1;

-- Q14) Extract top 3 highest sum of score for each device id and the corresponding
player_id
select top 3 Dev_ID,P_ID,SUM(Score) as score
from level_details2
group by Dev_ID,P_ID
order by score desc

-- Q15) Find players who scored more than 50% of the avg score scored by sum of
-- scores for each player_id

WITH PlayerScores AS (
SELECT P_ID, SUM(Score) AS Total_Score
FROM level_details2
GROUP BY P_ID
),
AvgScores AS (
SELECT AVG(Total_Score) AS Avg_Score
FROM PlayerScores)
SELECT ps.P_ID, ps.Total_Score, a.Avg_Score
FROM PlayerScores ps, AvgScores a
WHERE ps.Total_Score > 0.5 * a.Avg_Score;

-- Q16) Create a stored procedure to find top n headshots_count based on each dev_id and
Rank them in increasing order
-- using Row_Number. Display difficulty as well

ALTER PROCEDURE [dbo].[GetTopHeadshots](@n INT,@Headshots_Count int output)


AS
BEGIN
WITH RankedHeadshots AS (
SELECT Dev_ID, Difficulty, Headshots_Count,
ROW_NUMBER() OVER (PARTITION BY Dev_ID ORDER BY Headshots_Count) ASrow_num
FROM level_details2
WHERE Dev_ID IS NOT NULL
AND Headshots_Count IS NOT NULL
)
SELECT Dev_ID, Difficulty, Headshots_Count, row_num AS rank
FROM RankedHeadshots
WHERE row_num <= @n; ‫الشرط الي النتايج تطلع علي اساسه‬
select @Headshots_Count=@@ROWCOUNT --‫بعرف القيمه الي هتتحط فاالوتبوت عباره عن ايي‬
END;

DECLARE @count INT— ‫بعرف متغير احط فيه القيمه‬


exec
GetTopHeadshots 3 --‫رقم الصف االخير فعرض النتائج‬
,@count output
select @count as "No of Headcount found"-- ‫اسم الناتج‬
-- Q17) Create a function to return sum of Score for a given player_id.
CREATE FUNCTION GetTotalScoreForPlayer
(
@player_id INT
)
RETURNS INT
AS
BEGIN
DECLARE @totalScore INT;

SELECT @totalScore = SUM(Score)


FROM level_details2
WHERE P_ID = @player_id;

RETURN @totalScore;
END;
SELECT dbo.GetTotalScoreForPlayer(632) as Total_Score

You might also like