SQL - 根据特定列上的出现从select中删除元组

时间:2015-11-18 06:14:19

标签: sql postgresql greatest-n-per-group

考虑表示比赛历史的简单表格:

 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

如果我们考虑每个司机的第一次出现是正确的。但是,我不知道如何选择它。有什么想法吗?

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

或者

SQL-DISTINCT

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 $。 谢谢!

相关问题