【问题标题】:Find max string value in column在列中查找最大字符串值
【发布时间】:2020-01-24 11:04:56
【问题描述】:

我有一个表格,其中有一列用于指示位置。职位以 A 开头,可以上升到 AZ,就像在 Excel 中一样。 例如

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

等等

如果我使用select max(position) from table where row = 1,结果总是 Z 而不是 AB。

如何选择 varchar 类型的列的最大值?

【问题讨论】:

  • ':' 的定位是什么?
  • 不想输入 A 到 Z 之间的所有值,所以它表示 C 和 Z 之间的值 :)

标签: sql sql-server tsql group-by sql-order-by


【解决方案1】:

这是一种方法:

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

【讨论】:

  • 用 10M 行的表测试了这种方法与正确的(....)方法。这大约快 10 - 15%。
【解决方案2】:

position 的值左填充空格(如果需要),所以它们都是可比的,然后得到最大值:

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

请参阅demo
结果(针对您的样本数据):
AB

【讨论】:

    【解决方案3】:

    如果您想使用 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;
    

    【讨论】:

    • @der_roedie 您是否有理由接受这个答案,它使用与我的答案相同的代码但后来发布?
    • 不,不是,但我无法接受这两个答案,因此我选择了 Gordon 的回复,因为他解释得更详细一些。
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多