Oracle Order by-Function Based(dense_rank)

时间:2016-09-05 21:15:57

标签: sql oracle oracle11g oracle10g

我有一个包含以下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

我希望编写一个可以使用以下

对记录进行排序的查询
  • 首先由Aisle(升序)

  • 然后通过Rack(上升为一个过道,下降为下一个和 等等。 。这是我似乎无法弄清楚它是否可以的部分 在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

我们按照条款

制定了以下命令
order by aisle,
      (case when mod(dense_rank() over (order by aisle), 2) = 1 then rack else - rack
       end),
      level,
      position

但是,我收到错误" ORA-00932:不一致的数据类型:当我执行查询时,预期CHAR得到了NUMBER" 。列都是VARCHAR2类型。

我能做些什么才能让它发挥作用?

2 个答案:

答案 0 :(得分:4)

如果列是varchar2(),那么一元减号就不会那么好了。

相反怎么样?

order by aisle,
      (case when mod(dense_rank() over (order by aisle), 2) = 1 then rack end) asc,
      (case when mod(dense_rank() over (order by aisle), 2) = 0 then rack end) desc,
      level,
      position

答案 1 :(得分:0)

您可以按rack,升序/降序排序,但如果您将rack保留为varchar2,那么9将按照升序排列在10之前(因为您按字母顺序排序,而不是按字母顺序排序,按字母顺序,字符1出现在9)之前。

除非这是预期的行为(它可能是,但它不常见),最好将rack的所有出现包裹在to_number()内,即按{{1}排序 - 无论是在您最初的尝试中(现在应该如何使用此修改)还是在Gordon的解决方案中 - 这可能会受到"字母顺序的影响"如果您不使用to_number(rack),则会出现问题。