sql - Oracle 排序依据 - 基于函数 (dense_rank)

标签 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

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

  • 首先按过道(升序)

  • 然后按货架(一个过道上升,下一个过道下降) 很快。 。 .这是我似乎无法弄清楚是否可以的部分 在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 Clause

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 类型。

我该怎么做才能让它发挥作用?

最佳答案

如果列是 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

关于sql - Oracle 排序依据 - 基于函数 (dense_rank),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39337780/

相关文章:

c# - 无法加载文件或程序集 'Oracle.DataAccess 错误

sql - 如何在不止一列上计算 DISTINCT

sql - Oracle 空字符正则表达式

mysql - 如何在第一个日期高于引用日期的情况下选择第一个日期、上一个日期、最晚日期

oracle - ORA-12505,TNS :listener does not currently know of SID given in connect

SQL:仅使用每行一次 self 联接

c# - 将 'numerical' 排序应用于具有多个小数点/句点的奇数数据结构

SQL - 左外连接、减号、交集速度比较

sql - 从多个源/表插入

php - 在 mysql 中获得更快记录搜索的最佳方法