2013-02-17 77 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