我创建了一个表
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);
对于每个路线编号,有2条记录,我需要根据route,fare
和type
为每条路线选择一行(quality
)。
例如,如果type
为'X'
且quality
为“GOOD'
或'AVERAGE'
,我将选择route
和fare
那一行并转移到下一个'路线'。否则,我将从类型为“Y”的行中选择“路线”和“票价”。这意味着从上表中我得到:
1,5
2,10
3,15
我无法想出循环遍历每条路线的记录并从同一路线的两条记录中得出输出。
答案 0 :(得分:1)
SELECT DISTINCT ON (route)
route, fare
FROM routes
ORDER BY route, (type = 'X' AND quality <> 'BAD') DESC, (type = 'X')
快速生成按路线排序的结果
假设所有列NOT NULL
。
您可以在Postgres中按布尔表达式排序。这个相关答案的细节:
Time based priority in Active Record Query
我们可以使用type DESC
作为最后一个ORDER BY
元素,但这将依赖于字母排序顺序,而X
和Y
看起来像其他东西的占位符。
DISTINCT ON
的更多解释:
Select first row in each GROUP BY group?
答案 1 :(得分: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
演示 - &gt; http://www.sqlfiddle.com/#!2/e58441/2