【问题标题】:Oracle Order by - Function BasedOracle Order by - 基于函数
【发布时间】:2016-07-13 20:59:45
【问题描述】:

我有一个表,其中包含以下 4 列和一些示例数据

Aisle | Rack | Level | Position
  1        1       1         1
  1        2       1         2
  2        1       1         1
  2        2       1         1
  2        3       1         1
  3        1       1         1
  3        2       1         1

我希望编写一个可以使用以下方法对记录进行排序的查询

  • 首先由过道(上升)
  • 然后通过机架(上升到一个过道和 下降为下一个等等。 . . 这是我做不到的部分 似乎想知道在Oracle中是否可以实现
  • 然后按级别(升序)
  • 然后按位置(升序)

所以得到的有序行如下

 Aisle | Rack | Level | Position
  1        1       1         1
  1        2       1         2
  2        3       1         1
  2        2       1         1
  2        1       1         1
  3        1       1         1
  3        2       1         1

这在 Oracle 中可以实现吗?

【问题讨论】:

    标签: sql oracle oracle11g oracle10g


    【解决方案1】:

    您需要做的是枚举过道,以便识别奇数和偶数。函数dense_rank() 执行此操作——并且在order by 子句中是允许的。

    所以:

    order by aisle,
             (case when mod(dense_rank() over (order by aisle), 2) = 1
                   then rack else - rack
              end),
             level, position
    

    其实如果aisle没有空格,你也可以使用:

    order by aisle,
             (case when mod(aisle, 2) = 1
                   then rack else - rack
              end),
             level, position
    

    【讨论】:

    • 谢谢。这看起来很有希望。只有一个警告。也有可能我只会得到奇数(或偶数)编号的过道来工作。因此,备用过道应遵循机架上的上升和下降。能做到吗?
    • 好的。刚刚研究了dense_rank,答案很合适:-)非常感谢戈登。
    • 我在执行查询时收到错误“ORA-01722: invalid number”。这些列都是 VARCHAR2 类型。我该怎么做才能让它发挥作用?请帮忙。
    • @Guddu。 . .唯一可能遇到转换问题的地方是mod(aisle, 2)。相反,您可以使用substr(aisle, -1, 1) in ('1', '3', '5', '7', '9')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多