1

我创建了一个表

create table routes (
   type    character varying
 , quality character varying
 , route   integer
 , fare    integer
);

insert into routes (type, quality, route, fare)
values
  ('X', 'GOOD',    1, 5)
 ,('Y', 'GOOD',    1, 7)
 ,('X', 'AVERAGE', 2, 10)
 ,('Y', 'GOOD',    2, 7)
 ,('X', 'BAD',     3, 8)
 ,('Y', 'BAD',     3, 15);

route,fare对于每个路线编号,有 2 条记录,我需要根据type和为每条路线选择一行( ) quality
例如,如果typeis 'X'and qualityis ' GOOD'or 'AVERAGE',我将选择该行的routeandfare并移至下一个 'route' 。否则,我将从类型为“Y”的行中选择“路线”和“票价”。这意味着从上表中,我应该得到:

1,5
2,10
3,15

我无法弄清楚循环遍历每条路线的记录并从同一路线的两条记录中得出输出。

4

2 回答 2

1
SELECT DISTINCT ON (route)
       route, fare
FROM   routes
ORDER  BY route, (type = 'X' AND quality <> 'BAD') DESC, (type = 'X')

快速并产生按路线排序的结果。
假设所有列NOT NULL

解释

您可以在 Postgres 中按布尔表达式排序。此相关答案中的详细信息:
Active Record Query 中基于时间的优先级

我们可以只type DESC用作最后一个ORDER BY元素,但这将依赖于字母排序顺序,XY看起来像是其他东西的占位符。

更多解释DISTINCT ON
在每个 GROUP BY 组中选择第一行?

->SQLfiddle 演示。

于 2013-10-20T23:38:22.403 回答
0

试试这个查询(使用 JOIN 和 CASE 表达式):

SELECT  x.route,
        CASE WHEN x.quality IN ('GOOD', 'AVERAGE' )
             THEN x.fare  ELSE y.fare
        END fare
FROM routes x
JOIN routes y
ON x.type = 'X' AND y.type = 'Y' AND x.route = y.route 

演示 --> http://www.sqlfiddle.com/#!2/e58441/2

于 2013-10-20T10:53:21.737 回答