Столкнулся с такой задачей: нужно для каждой строки результата работы SQL-запроса вывести номер этой строки внутри отсортированного по неким параметрам массива. Чтобы было понятно, о чем речь, приведу пример. Есть таблица с данными:
val
-------
7
3
1
5
9
4
Нужно вывести эти числа, не используя ORDER BY или еще каких SQL-инструкций и вычилсить их номер в отсортированном массиве. Результат должен быть такой:
val idx
--------------
7 | 4
3 | 1
1 | 0
5 | 3
9 | 5
4 | 2
Столбец "index" должен быть вычислен. Что есть номер элемента в отсортированном по возрастанию массиве? - это число элементов, которые меньше его. Если таких элементов нет - то значит данный элемент самый маленький и будет стоять первым и иметь индекс 0. Таким образом, получаем первый вариант запроса:
SELECT
tbl.value as val
(SELECT
count(*)
FROM
tbl tbl2
WHERE
tbl2.value < val ) as idx
FROM
tbl
Это будет работать, но возникает проблема, если есть повторяющиеся числа. Тогда некоторые элементы будут иметь одинаковый индекс, а нам это не подходит. Что делать в таком случае? Я использовал значение первичного ключа как дополнительный параметр для сравнения: если два значения равны, то сравниваем их первичные ключи - уж они-то точно будут разными. Улучшенный вариант предыдущего запроса будет выглядеть так:
SELECT
tbl.id as myid
tbl.value as val
(SELECT
count(*)
FROM
tbl tbl2
WHERE
(tbl2.value < val)
OR
(tbl2.value = val AND tbl2.id < myid) ) as idx
FROM
tbl
Последний вариант и был успешно использован.