我有一个名为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
这个不起作用。它给出了错误的结果。
我该如何解决?
答案 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