在sql中选择分组值

时间:2013-10-20 10:39:14

标签: 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,faretype为每条路线选择一行(quality)。 例如,如果type'X'quality为“GOOD''AVERAGE',我将选择routefare那一行并转移到下一个'路线'。否则,我将从类型为“Y”的行中选择“路线”和“票价”。这意味着从上表中我得到:

1,5
2,10
3,15

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

2 个答案:

答案 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元素,但这将依赖于字母排序顺序,而XY看起来像其他东西的占位符。

DISTINCT ON的更多解释:
Select first row in each GROUP BY group?

->SQLfiddle demo.

答案 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