2013-02-17 60 views
0

我有两个表:查询序列化数据

 
Routes 

ID Description 
1 street1 
2 street2 
3 street3 
4 street4 
5 street5 

Segments 

ID RouteID, Progres, LabelStart, LabelEnd 
1 1  5   1 A  21 B 
2 1  10   2 A  10 
3 2  15   3   25 
4 2  15   2   20 
5 3  20   1   11 
6 3  22   4   10 
7 4  30   5   11 
8 4  31   2   12 

我需要这些规则的顺序:

  • 列类型被定义
    1. 表必须由进展ASC进行排序,并采取O如果LabelStart和LabelEnd是奇数,E如果是偶数
    2. 如果两个路径具有相同的进度,则合并行中的行 LabelStart是最小值(在LabelStart O DD和LabelStart即使) 和LabelEnd是MAX,在这种情况下类型需要A(所有的值)

    根据实施例的结果上面的数据应该是

     
    Sequence 
    ID RouteID, Progres, LabelStart, LabelEnd Type 
    1 1  5   1 A  21 B O 
    2 1  10   2 A  10  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 
    

    它是Postgres的9.2

  • 回答

    1

    这是一个有趣的查询,因为您的LabelStart和LabelEnd字段中包含字母。我用REGEX_REPLACE删除这些。然后我使用CTE来获取具有多个routeid和progress行的记录。

    我想这应该这样做:

    WITH CTE AS (
        SELECT 
        RouteId, Progress 
        FROM Sequence 
        GROUP BY RouteId, Progress 
        HAVING COUNT(DISTINCT Id) > 1 
    ) 
    SELECT MAX(S.ID) Id, 
        T.RouteId, 
        T.Progress, 
        MIN(regexp_replace(LabelStart, '[^0-9]', '', 'g')) LabelStart, 
        MAX(regexp_replace(LabelStart, '[^0-9]', '', 'g')) LabelEnd, 
        'A' as Type 
    FROM Sequence S 
        INNER JOIN CTE T ON S.RouteId = T.RouteId AND S.Progress = T.Progress 
    GROUP BY T.RouteId, T.Progress 
    UNION 
    SELECT S.Id, 
        S.RouteId, 
        S.Progress, 
        S.LabelStart, 
        S.LabelEnd, 
        CASE 
        WHEN CAST(regexp_replace(LabelStart, '[^0-9]', '', 'g') as int) % 2 = 0 
        THEN 'E' 
        ELSE 'O' 
        END 
    FROM Sequence S 
        LEFT JOIN CTE T ON S.RouteId = T.RouteId AND S.Progress = T.Progress 
    WHERE T.RouteId IS NULL 
    ORDER BY Progress ASC 
    

    和一些示例Fiddle

    +0

    它看起来像工作,很棒的主意。我必须在添加其他连接的生产环境中测试它。但我认为它会完成这项工作,非常感谢 – user1944934 2013-02-18 11:40:23

    +0

    如果我想报告路由描述以及结果表中的如何调整您的建议? – user1944934 2013-02-24 22:47:50