0

我有两张桌子:

路线

标识说明
1 条街道1
2街2
3街3
4街4
5街5

细分市场

ID RouteID、Progres、LabelStart、LabelEnd
1 1 5 1 A 21 B
2 1 10 2 一个 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. 表必须由 Progress ASC 订购
  2. 定义了一个列类型,如果 LabelStart 和 LabelEnd 是奇数则取 O,如果偶数取 E
  3. 如果两条路线的进度相同,则将行合并为一个,其中 LabelStart 是最小值(在 LabelStart Odd 和 LabelStart Even 之间),LabelEnd 是 Max,在这种情况下,Type 取值 A(All)

根据上面的示例数据,结果应该是

顺序  
ID RouteID、Progres、LabelStart、LabelEnd 类型
1 1 5 1 A 21 BO
2 1 10 2 A 10 E
4 2 15 2 25 安
5 3 20 1 11 ○
6 3 22 4 10 E
7 4 30 5 11 ○
8 4 31 2 12

它适用于 Postgres 9.2

4

1 回答 1

1

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

我认为应该这样做:

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

于 2013-02-18T02:24:22.180 回答