I have a query that currently returns data with the following attributes:
Example:
+--+-+-+
|id|A|B|
+--+-+-+
| 5|1|2|
|15|3|2|
|12|4|5|
|66|6|5|
| 2|7|2|
+--+-+-+
I've seen answers here which explain how to return the row number in the result. What I do need, however, is to obtain a (preferrably 1-based) order number while keeping a distinct count for each B. In the following table, C is the desired result:
+--+-+-+-+
|id|A|B|C|
+--+-+-+-+
| 5|1|2|1|
|15|3|2|2|
|12|4|5|1|
|66|6|5|2|
| 2|7|2|3|
+--+-+-+-+
This goes a little beyond my current SQL skill, so I'll be thankful for any pointers. Including pointers to existing answers!
EDIT: Both answers below work equally well in terms of results (with a dummy wrapping query used for sorting). Thank you all for the help. Which would be the most efficient query? Consider that in my specific use case, the amount of rows returned from the original query is never very large (let's say up to 50 rows, and even that is a stretch of the imagination). Also, the original query has joins used for fetching data from other relations, although they are not relevant for sorting or filtering. Finally, it is possible for all results to have the same B, or for every one of them to have a distinct B - it can go either way or anywhere inbetween.
What you basically want is the RANK() function. However, since it's not available in MySQL, you can simulate it with:
SELECT *
FROM (
SELECT a, b, (CASE b
WHEN @partition THEN @rank := @rank + 1
ELSE @rank := 1 AND @partition := b END) AS c
FROM tbl, (SELECT @rank := 0, @partition := '') tmp
ORDER BY b, a
) tmp
ORDER BY a
DEMO (SQL Fiddle).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With