Tags
Complex SQL Challenges, Complex TSQL Challenge, Interview Qs.SQL SERVER Questions, Interview Questions on SQL, InterviewQuestions, InterviewQuestions for SQL, Learn complex SQL, Learn SQL, Learn T-SQL, MSBISkills, PL/SQL Challenges, Puzzles, Queries for SQL Interview, SQL, SQL 2012, SQL 2014, SQL 2014 Interview Questions, SQL Challenge, SQL Challenges, SQL FAQs, SQL Interview, SQL Interview Puzzles, SQL IQs, SQL pl/sql puzzles, SQL Puzzles, SQL Queries, SQL Server 2012 Analysis Services, SQL Server Data Tools, SQL SERVER Interview questions, SQL SERver performance, SQL SERVER Puzzles, SQL SERVER2005/2008, SQL Skills, SQL Sudoku, SQLPuzzles, SQLQueries, SQLSERVER, T SQL Puzzles, T-SQL Challenge, Tough SQL Challenges, Tough SQL Puzzles, TSQL, TSQL Challenge, TSQL Challenges, TSQL Interview questions, TSQL Queries
T-SQL Query | [ Complete the sequence Puzzle ]
The puzzle is simple. Here the participants were given month-wise score values and were asked to complete the sequence by creating entries for missing month. Please check out the sample input and expected output for details.
Sample Input
YearMonth | Score |
200903 | 100 |
200803 | 95 |
200802 | 99 |
200801 | 100 |
200711 | 100 |
Expected output
yearmonth | score |
200711 | 100 |
200712 | 100 |
200801 | 100 |
200802 | 99 |
200803 | 95 |
200804 | 95 |
200805 | 95 |
200806 | 95 |
200807 | 95 |
200808 | 95 |
200809 | 95 |
200810 | 95 |
200811 | 95 |
200812 | 95 |
200901 | 95 |
200902 | 95 |
200903 | 100 |
200904 | 100 |
200905 | 100 |
200906 | 100 |
200907 | 100 |
200908 | 100 |
200909 | 100 |
200910 | 100 |
200911 | 100 |
200912 | 100 |
201001 | 100 |
201002 | 100 |
201003 | 100 |
201004 | 100 |
201005 | 100 |
201006 | 100 |
201007 | 100 |
201008 | 100 |
201009 | 100 |
201010 | 100 |
201011 | 100 |
201012 | 100 |
201101 | 100 |
201102 | 100 |
201103 | 100 |
201104 | 100 |
201105 | 100 |
201106 | 100 |
201107 | 100 |
201108 | 100 |
201109 | 100 |
201110 | 100 |
201111 | 100 |
201112 | 100 |
201201 | 100 |
201202 | 100 |
201203 | 100 |
201204 | 100 |
201205 | 100 |
201206 | 100 |
201207 | 100 |
201208 | 100 |
201209 | 100 |
201210 | 100 |
201211 | 100 |
201212 | 100 |
201301 | 100 |
201302 | 100 |
201303 | 100 |
201304 | 100 |
201305 | 100 |
201306 | 100 |
201307 | 100 |
201308 | 100 |
201309 | 100 |
201310 | 100 |
201311 | 100 |
201312 | 100 |
201401 | 100 |
201402 | 100 |
201403 | 100 |
201404 | 100 |
201405 | 100 |
201406 | 100 |
201407 | 100 |
201408 | 100 |
201409 | 100 |
201410 | 100 |
201411 | 100 |
201412 | 100 |
201501 | 100 |
201502 | 100 |
201503 | 100 |
201504 | 100 |
Rules/Restrictions
- The solution should be should use “SELECT” statement or “CTE”.
- Add your solution(s) in the comments section or send you solution(s) to pawankkmr@gmail.com
Script
Use the below script to generate the source table and fill them up with the sample data.
DECLARE @Scores TABLE ( YearMonth INT, Score INT ) INSERT @Scores VALUES(200903, 100) INSERT @Scores VALUES(200803, 95) INSERT @Scores VALUES(200802, 99) INSERT @Scores VALUES(200801 ,100) INSERT @Scores VALUES(200711, 100) |
UPDATE – 20-Apr-2015 – Solution 1
-- ;WITH CTE AS ( SELECT CAST ( LEFT(YearMonth,4) + '/' + RIGHT(YearMonth,2) + '/' + '01' AS VARCHAR(10)) YearMonth , Score ,ROW_NUMBER() OVER ( ORDER BY YearMonth ) ranker FROM SCORES ) ,CTE1 AS ( SELECT c1.YearMonth, CAST ( '<x>' + CAST(c1.ranker AS VARCHAR(10)) + '</x>' AS XML ) ranker,c1.ranker rnk ,c1.Score,ISNULL(c2.YearMonth,c1.YearMonth) YearMonthEnds FROM CTE c1 LEFT JOIN CTE c2 ON c1.ranker = c2.ranker - 1 ) ,CTE2 AS ( SELECT *, DATEDIFF ( M ,YearMonth, YearMonthEnds ) diff , CAST ( REPLICATE( CAST ( ranker AS VARCHAR(10)) + ',' , CASE WHEN DATEDIFF ( M ,YearMonth, YearMonthEnds ) > 1 THEN DATEDIFF ( M ,YearMonth, YearMonthEnds ) ELSE 1 END ) AS XML ) xmlcol FROM CTE1 ) SELECT CONVERT(Varchar(7),DATEADD(m,RowNum,YearMonth),121) as AllocationMonth,Score FROM CTE2 s CROSS APPLY ( SELECT project.D.value('.','VARCHAR(50)') as SplitData,ROW_NUMBER() OVER(Partition by Project.D.value('.', 'varchar(50)') ORDER BY (SELECT NULL)) -1 as RowNum FROM s.xmlcol.nodes('x') as project(D) ) p ORDER BY AllocationMonth DESC -- |
Add a comment if you have any other solution in mind. We all need to learn.
Keep Learning
SELECT MYearMonths AS YearMonth,ScoreA AS Score
FROM
(
SELECT MYearMonths,YearMonth,rn,Score,g,
CASE WHEN Score is null THEN max(Score) OVER (partition by g ORDER BY (SELECT null)) ELSE Score END AS ScoreA
FROM
(
SELECT MYearMonths,YearMonth,rn,
Score,sum(grp) OVER(ORDER BY rn)AS g
FROM
(
SELECT MYearMonths,S.YearMonth,S.Score,
ROW_NUMBER() OVER(ORDER BY (SELECT null)) AS rn,
CASE WHEN S.Score is null THEN 0 ELSE 1 END AS grp
FROM
(
SELECT Years,tbl1.Months,CONCAT(Years,Months) AS MYearMonths FROM
(
SELECT DISTINCT LEFT(YearMonth,4) AS Years
–,tbl1.Months
FROM scores
union all
SELECT 2010
union all
SELECT 2011
union all
SELECT 2012
union all
SELECT 2013
union all
SELECT 2014
union all
SELECT 2015
)tbl0
cross join
(
SELECT ’01’ AS Months union
SELECT ’02’ union
SELECT ’03’ union
SELECT ’04’ union
SELECT ’05’ union
SELECT ’06’ union
SELECT ’07’ union
SELECT ’08’ union
SELECT ’09’ union
SELECT ’10’ union
SELECT ’11’ union
SELECT ’12’
)tbl1
)tblYearMonth
left join
Scores S ON
MYearMonths=S.YearMonth
)tbl2
)tbl3
)tbl4
WHERE g>=1
LikeLike