我创建了一个表
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
我想不出循环遍历每条路线的记录并从同一路线的两条记录中得出输出。
最佳答案
SELECT DISTINCT ON (route)
route, fare
FROM routes
ORDER BY route, (type = 'X' AND quality <> 'BAD') DESC, (type = 'X')
快速并生成按路线排序的结果。
假设所有列 NOT NULL
。
说明
您可以在 Postgres 中按 bool 表达式排序。此相关答案中的详细信息:
Time based priority in Active Record Query
我们可以只使用 type DESC
作为最后一个 ORDER BY
元素,但这将依赖于字母排序顺序,而 X
和 Y
看起来像是其他东西的占位符。
DISTINCT ON
的更多解释:
Select first row in each GROUP BY group?
关于sql - 在sql中选择分组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476404/