有条件的订单由
问题描述:
我有一个表,其中有一组具有开始标签和结束标签的路线。每行都有一个“progres”列,它是应用全球“order by”子句的列,最后是一个选择列,用于指示必须订购哪些标签类型(奇数,偶数或全部)。 如果LabelStart> LabelEnd => ORDER BY ASC另外通过DESC有条件的订单由
例如这里的路线路径
Routes ID RouteID, Progres, LabelStart, LabelEnd Type 1 1 5 1 21 O 2 1 10 10 2 E 4 2 15 2 25 A 5 3 20 1 11 O 6 3 22 4 10 E 7 4 30 5 11 O 8 4 31 2 12 E
这里属于路线
Points PoinID RouteID, Label 1 1 3 2 1 2 4 1 1 5 1 8 6 1 5 7 1 6 8 1 9 9 1 21 10 1 10 11 1 11 12 2 1 13 2 2 14 2 12 15 2 3 16 2 25 17 2 14 ...
点我需要的是一个表中所有点由Routes Proges全局排序,由Even,Odd或All根据类型分组,最后由ASC按LabelClass> LabelEnd else DESC排序。结果是768,16:
ID RouteID, PointID 1 1 4 2 1 1 4 1 6 5 1 8 6 1 11 7 1 9 8 1 10 9 1 5 10 1 7 11 1 2 12 2 13 13 2 15 ...
答
select
row_number() over() id, *
from (
select
r.routeid,
p.pointid,
label,
type,
labelstart,
labelend
from
route r
inner join
point p on p.routeid = r.routeid
where
r.type = 'E' and p.label % 2 = 0
or
r.type = 'O' and p.label % 2 != 0
or
r.type = 'A'
order by
r.routeid, r.progres, r.id,
case labelstart < labelend
when true then label
else label * - 1
end
) s
+0
的顺序确实工作。无论如何,我试图把Asc和Desc的顺序动态的,但它没有奏效 – amilaishere 2016-11-11 10:11:36
的分组可能很容易与'CASE'语句进行处理。尽管动态地切换排序顺序,但您可能必须使用PL/PgSQL函数,该函数使用'EXECUTE format(...)USING ...'生成查询。 – 2013-03-11 22:41:56
为什么不能按照子句/ – 2013-03-11 22:54:09