考虑表示比赛历史的简单表格:
laphistory(race_id integer,lap_number integer,pos_number integer,
driver_label text,id integer NOT NULL,CONSTRAINT id PRIMARY KEY (id) ...)
现在,请考虑以下示例:
race_id;lap_number;pos_number;driver_label;id
1 ;1 ;1 ;"Matheus" ;1
1 ;1 ;2 ;"Nicolas" ;2
1 ;1 ;3 ;"Diego" ;3
1 ;2 ;1 ;"Nicolas" ;4
1 ;2 ;2 ;"Diego" ;5
1 ;2 ;3 ;"Matheus" ;6
1 ;3 ;1 ;"Nicolas" ;7
1 ;3 ;2 ;"Diego" ;8
1 ;4 ;1 ;"Diego" ;9
根据上面的例子,比赛1的结果(为每个车手命令最后一圈的位置)应该是(我们可以在这里忽略" pos_number"):
race_id;lap_number;pos_number;driver_label;id
1 ;4 ;1 ;"Diego" ;9
1 ;3 ;1 ;"Nicolas" ;7
1 ;2 ;3 ;"Matheus" ;6
使用简单查询查询BD:
select * from laphistory order by lap_number DESC, pos_number ASC
将带来以下结果:
race_id;lap_number;pos_number;driver_label;id
1 ;4 ;1 ;"Diego" ;9 <<<
1 ;3 ;1 ;"Nicolas" ;7 <<<
1 ;3 ;2 ;"Diego" ;8
1 ;2 ;1 ;"Nicolas" ;4
1 ;2 ;2 ;"Diego" ;5
1 ;2 ;3 ;"Matheus" ;6 <<<
1 ;1 ;1 ;"Matheus" ;1
1 ;1 ;2 ;"Nicolas" ;2
1 ;1 ;3 ;"Diego" ;3
如果我们考虑每个司机的第一次出现是正确的。但是,我不知道如何选择它。有什么想法吗?
答案 0 :(得分:1)
可以应用PostgreSQL的window function
来获得所需的输出:
SELECT *
FROM (
SELECT *
,row_number() OVER (
PARTITION BY driver_label ORDER BY lap_number DESC
) AS rank
FROM race
) t
WHERE rank = 1
或者
SELECT DISTINCT ON (driver_label) *
FROM race
ORDER BY driver_label ASC
,lap_number DESC
答案 1 :(得分:0)
简单的GROUP BY应该做你需要的:
select race_id, lap_number, min(id) from foo
group by race_id, lap_number
order by race_id asc, lap_number desc
答案 2 :(得分:0)
我感谢Vivek.S&#39;很棒的答案。做了一些改编:
ViewBinder
现在我可以让司机订购一圈$ x $。 谢谢!