有条件的订单由

问题描述:

我有一个表,其中有一组具有开始标签和结束标签的路线。每行都有一个“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 
... 

+1

的分组可能很容易与'CASE'语句进行​​处理。尽管动态地切换排序顺序,但您可能必须使用PL/PgSQL函数,该函数使用'EXECUTE format(...)USING ...'生成查询。 – 2013-03-11 22:41:56

+0

为什么不能按照子句/ – 2013-03-11 22:54:09

SQL Fiddle

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