2013-02-17 3 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 Прогресс
  2. A Тип столбца определен и принимать O, если LabelStart и LabelEnd являются нечетными, E, если равно
  3. , если два маршрута имеют тот же прогресс, тогда строки объединяются в один, где LabelStart является минимальным (среди LabelStart O дд и LabelStart Даже) и LabelEnd является Макс, в этом случае тип принимает значение 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 для получения записей, содержащих более одного маршрута и строки прогресса.

Я думаю, что это нужно сделать, это:

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

+0

как адаптировать ваше предложение, если я хочу сообщать о маршрутах Описание также в таблице результатов? – user1944934

Смежные вопросы