条件订单

时间:2013-03-11 22:09:26

标签: sql postgresql postgresql-9.2

我有一个表,其中有一组带有开始标签和结束标签的路线。每行都有一列“progres”,它是应用全局“order by”子句的列,最后是一个选择列,用于指示必须订购哪些标签类型(奇数,偶数或全部)。 如果LabelStart> LabelEnd =>由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订购,如果LabelStart> LabelEnd来自DESC。结果应该是:

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 个答案:

答案 0 :(得分:9)

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