Oracle 排序依据 - 基于函数 (dense_rank)
Oracle Order by - Function Based (dense_rank)
我有一个 table,其中有以下 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: inconsistent datatypes: expected CHAR got 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
、ascending/descending 排序,但如果您将 rack
保留为 varchar2
,则 9 将按升序排在 10 之前(因为您正在排序按字母顺序,而不是数字,按字母顺序,字符 1 在 9 之前)。
除非这是预期的行为(它可能是,但不常见),最好将所有出现的 rack
包装在 to_number()
内,即按 to_number(rack)
- 无论是在您最初的尝试中(现在应该可以进行此修改)还是在 Gordon 的解决方案中 - 如果您不使用 to_number()
.[= 可能会遇到 "alphabetical ordering" 问题17=]
我有一个 table,其中有以下 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: inconsistent datatypes: expected CHAR got 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
、ascending/descending 排序,但如果您将 rack
保留为 varchar2
,则 9 将按升序排在 10 之前(因为您正在排序按字母顺序,而不是数字,按字母顺序,字符 1 在 9 之前)。
除非这是预期的行为(它可能是,但不常见),最好将所有出现的 rack
包装在 to_number()
内,即按 to_number(rack)
- 无论是在您最初的尝试中(现在应该可以进行此修改)还是在 Gordon 的解决方案中 - 如果您不使用 to_number()
.[= 可能会遇到 "alphabetical ordering" 问题17=]