Найти максимальное значение строки в столбце - PullRequest
1 голос
/ 24 января 2020

У меня есть таблица с колонкой, которая используется для обозначения позиции. Позиции начинаются с A и могут go до AZ, как в Excel. EG

Row | Position
----|---------
 1  |    A
 1  |    B
 1  |    C
 :  |    :
 1  |    Z
 1  |   AA
 1  |   AB
 2  |    A
 2  |    B

et c.

Если я использую select max(position) from table where row = 1, то результатом всегда будет Z, а не AB.

Как выбрать максимальное значение столбец который типа varchar?

Ответы [ 3 ]

6 голосов
/ 24 января 2020

Вот один из способов сделать это:

select top 1 position from mytable where row = 1 order by len(position) desc, position desc

Это работает путем сортировки записей по убыванию длины позиции, затем по убыванию позиции, а затем выбора верхней записи в наборе результатов.


Если вы хотите максимум на row, то вы можете использовать row_number():

select row, position
from (
    select 
        t.*, 
        row_number() over(partition by row order by len(position) desc, position desc) rn
    from mytable t
) t
where rn = 1
3 голосов
/ 24 января 2020

Слева добавьте значение position с пробелами (если необходимо), чтобы все они были сопоставимы, а затем получите максимум:

select ltrim(max(right('  ' + position, 2))) 
from tablename
where row = 1

См. Демоверсию . Результат (для ваших образцов данных): AB

1 голос
/ 24 января 2020

Если вы хотите сделать это с MAX(), то вы можете преобразовать значения в выровненные по правому краю значения:

select max(right('  ' + position, 2))
from t
where row = 1;

(Предполагается, что максимальная длина равна 2, исходя из ссылки на Excel .)

Вы можете удалить любые начальные пробелы, используя ltrim():

select ltrim(max(right('  ' + position, 2)))
from t
where row = 1;

Преимущество этого подхода в том, что он легко вписывается в GROUP BY:

select row, ltrim(max(right('  ' + position, 2))) as position
from t
group by row;
...