Sql 基于函数的Oracle订单(密集等级)
我有一个表,其中包含以下4列和一些示例数据Sql 基于函数的Oracle订单(密集等级),sql,oracle,oracle11g,oracle10g,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
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 aisle,
(case when mod(dense_rank() over (order by aisle), 2) = 1 then rack else - rack
end),
level,
position
但是,当我执行查询时,我得到一个错误“”ORA-00932:不一致的数据类型:预期的CHAR get 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
您可以按
rack
、升序/降序排序,但如果将rack
保留为varchar2
,则9将以升序排在10之前(因为您是按字母顺序排序,而不是按数字顺序排序,并且按字母顺序,字符1排在9之前)
除非这是预期的行为(可能是,但不常见),否则最好将所有出现的
rack
包装在to_number()
中,即,按订购to_number(rack)
——无论是在您最初的尝试中(经过此修改后,现在应该可以工作了)或者在Gordon的解决方案中-如果您不使用to_number()
非常感谢您,可能会遇到“字母顺序”问题。