Get percentiles of data-set with group by month

Posted by Cylindric on Stack Overflow See other posts from Stack Overflow or by Cylindric
Published on 2010-03-08T17:38:22Z Indexed on 2010/03/09 1:36 UTC
Read the original article Hit count: 320

Filed under:
|
|
|

Hello,

I have a SQL table with a whole load of records that look like this:

| Date       | Score |
+ -----------+-------+
| 01/01/2010 |     4 |
| 02/01/2010 |     6 |
| 03/01/2010 |    10 |
  ...
| 16/03/2010 |     2 |

I'm plotting this on a chart, so I get a nice line across the graph indicating score-over-time. Lovely.

Now, what I need to do is include the average score on the chart, so we can see how that changes over time, so I can simply add this to the mix:

SELECT 
    YEAR(SCOREDATE) 'Year', MONTH(SCOREDATE) 'Month',
    MIN(SCORE) MinScore, 
    AVG(SCORE) AverageScore, 
    MAX(SCORE) MaxScore
FROM SCORES
GROUP BY YEAR(SCOREDATE), MONTH(SCOREDATE) 
ORDER BY YEAR(SCOREDATE), MONTH(SCOREDATE) 

That's no problem so far.

The problem is, how can I easily calculate the percentiles at each time-period? I'm not sure that's the correct phrase. What I need in total is:

  • A line on the chart for the score (easy)
  • A line on the chart for the average (easy)
  • A line on the chart showing the band that 95% of the scores occupy (stumped)

It's the third one that I don't get. I need to calculate the 5% percentile figures, which I can do singly:

SELECT MAX(SubQ.SCORE) FROM
    (SELECT TOP 45 PERCENT SCORE 
    FROM SCORES
    WHERE YEAR(SCOREDATE) = 2010 AND MONTH(SCOREDATE) = 1
    ORDER BY SCORE ASC) AS SubQ

SELECT MIN(SubQ.SCORE) FROM
    (SELECT TOP 45 PERCENT SCORE 
    FROM SCORES
    WHERE YEAR(SCOREDATE) = 2010 AND MONTH(SCOREDATE) = 1
    ORDER BY SCORE DESC) AS SubQ

But I can't work out how to get a table of all the months.

| Date       | Average | 45% | 55% |
+ -----------+---------+-----+-----+
| 01/01/2010 |      13 |  11 |  15 |
| 02/01/2010 |      10 |   8 |  12 |
| 03/01/2010 |       5 |   4 |  10 |
  ...
| 16/03/2010 |       7 |   7 |   9 |

At the moment I'm going to have to load this lot up into my app, and calculate the figures myself. Or run a larger number of individual queries and collate the results.

© Stack Overflow or respective owner

Related posts about sql

Related posts about tsql