Могу ли я заменить в MySQL все значения в столбце по их позициям в упорядоченном списке значений - PullRequest
0 голосов
/ 25 августа 2011

У меня есть следующая таблица:

| col1 | col2 | col3 |
| 1    | 1.1  | 9.3  |
| 2    | 7.9  | 1.3  |
| 3    | 3.7  | 7.3  |
| 4    | 9.0  | 5.7  |

Мне нужно упорядочить строки, используя взвешенную сумму col2 и col3. Это легко сделать следующим образом:

select * from mytable order by (0.8*col2 + 0.2*col3)

Теперь я хочу сделать почти то же самое, единственное отличие состоит в том, что мне нужно заменить фактические значения в col2 и col3 позицией в упорядоченном списке всех значений в столбце. Например, во втором столбце должны быть сделаны следующие замены:

(1.1 -> 1, 3.7 -> 2, 7.9 -> 3, 9.0 -> 4)

Кто-нибудь знает, есть ли простой способ создать запрос, который бы это сделал? Другими словами, я хотел бы иметь что-то подобное:

select * from mytable order by (0.8*modified(col2) + 0.2*modified(col3))

где функция modified заменяет значение на его позицию в упорядоченном списке всех значений из столбца.

1 Ответ

0 голосов
/ 25 августа 2011

Вы можете попробовать что-то вроде этого:

SET @cnt := 0;
update mytable m ,
(
SELECT
    @cnt := @cnt + 1 as newid,
    col1
 from mytable order by (0.8*col2 + 0.2*col3)
) as mysorted
set a.col2 = mysorted.newid
where a.col1 = mysorted.col1
...