在给出所有其他列的同时,在同一查询中使用MIN值进行分组

时间:2015-06-29 15:27:22

标签: sql postgresql

我有一个名为a的视图,其中包含以下数据:

 ID    tDate        name     task   val
23   2015-06-14
23   2015-06-25
126  2015-06-18
126  2015-06-22
126  2015-06-24

ID是整数,tDate是时间戳。

基本上我想获得每个ID tDate的最小值并显示此行。 意思是:

ID   tDate       name     task   val
23   2015-06-14
126  2015-06-18

我写了这个查询:

select ID, min(tDate)
from a
group by ID
order by ID

这是有效的但是它不允许我展示a的所有其他列

例如,如果我这样做:

select ID, min(tDate), name
from a
group by ID
order by ID

它说该名称必须在group by下。所以我写了这个查询:

select ID, MIN(tDate), name, task, val , ....
from a
group by ID, name, task, val , ....
order by ID

这个不起作用。它给出了错误的结果。

我该如何解决?

3 个答案:

答案 0 :(得分:2)

对于这类问题,Postgres非常方便distinct on

select distinct on (id) a.*
from a
order by id, tdate;

这将为每个id返回一行。该行是由order by子句中定义的排序确定的第一行。

答案 1 :(得分:1)

在ID / Min Date

上从一个表到子查询表进行连接
select
      YT.ID,
      YT.tDate as OriginalDate,
      PQ.MinDate,
      YT.name,
      YT.task,
      YT.val
   from
      YourTable YT
         JOIN ( select ID, min( tdate ) as MinDate
                   from YourTable
                   group by ID ) as PQ
         on YT.ID = PQ.ID
        AND YT.tDate = PQ.MinDate
   order by
      ID

答案 2 :(得分:0)

尝试这样的事情:

select a.id, a.tdate , .... from a
join (select id, min(tdate) min_date   
from a
group by ID
) b
on a.id=b.id and a.tdate = b.min_date
order by a.id