sql - 在sql中选择分组值

标签 sql postgresql greatest-n-per-group

我创建了一个表

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' , 我会选择 routefare该行并移至下一个“路线”。否则,我将从类型为“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?

->SQLfiddle demo.

关于sql - 在sql中选择分组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476404/

相关文章:

MySql 1050 : MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists

sql - 如何在查询多个表的多列时从单个表的单列使用MAX

postgresql - Heroku Postgres 配置数据中心位置

mysql - 检索每个组中的最后一条记录 - MySQL

MYSQL:从两列中选择最高的ID并排序

sql - 如何从 SQL Server 2005 中的表中删除锁定?

sql - 全外连接与全连接

sql - 如果我们在有序集中有重复值,如何解决 LEAD 或 LAG 分析函数中的关系?

PostgreSQL 删除触发器

mysql - 如何在sql中选择超过2列的计数