I had an issue where I was trying to get the top 'n' records from each group (day) or records in my database. After a bunch of digging I found some great answers and they did in fact solve my problem.
However, my noob-ness is preventing me from understanding exactly WHY these "counting" solutions work. If someone with better SQL knowledge can explain, that would be really great.
EDIT: here's more details
Let's say I had a table described below with this sample data. (To make things simpler, I have a column that kept track of the time of the next upcoming midnight, in order to group 'per day' better).
id | vote_time | time_of_midnight |    name    | votes_yay | votes_nay
------------------------------------------------------------------------
 1 |     a     |        b         |  Person p  |    24     |     36
 1 |     a     |        b         |  Person q  |    20     |     10
 1 |     a     |        b         |  Person r  |    42     |     22
 1 |     c     |        d         |  Person p  |     8     |     10
 1 |     c     |        d         |  Person s  |   120     |     63
- There can be tens or hundreds of "People" per day (b, d, ...)
- id is some other column I needed in order to group by (you can think of it as an election id if that helps)
I'm trying to calculate the top 5 names that had the highest number of votes per day, in descending order. I was able to use the referenced articles to create a query that would give me the following results (on Oracle):
SELECT name, time_of_midnight, votes_yay, votes_nay, (votes_yay+votes_nay) AS total_votes
FROM results a
WHERE id=1 AND (
    SELECT COUNT(*) 
    FROM results b
    WHERE b.id=a.id AND b.time_of_midnight=a.time_of_midnight AND (a.votes_yay+a.votes_nay) >= (b.votes_yay+b.votes_nay)) <= 5
ORDER BY time_of_midnight DESC, total_votes DESC;
   name    | time_of_midnight | votes_yay | votes_nay | total_votes
------------------------------------------------------------------------
 Person s  |         d        |     120   |     63    |     183
 Person p  |         d        |       8   |     10    |      18
 Person r  |         b        |      42   |     22    |      64
 Person p  |         b        |      24   |     36    |      60
 Person q  |         b        |      20   |     10    |      30
So I'm not really sure
- Why this counting method works?
- [stupid]: Why don't I need to also include namein the inner query to make sure it doesn't join the data incorrectly?
 
     
    