我有下表
| id | date | team |
|----|------------|------|
| 1 | 2019-01-05 | A |
| 2 | 2019-01-05 | A |
| 3 | 2019-01-01 | A |
| 4 | 2019-01-04 | B |
| 5 | 2019-01-01 | B |
如何查询表以接收团队的最新值?
例如,上表的结果为ID 1,2,4
。
答案 0 :(得分:3)
在这种情况下,您可以使用窗口功能:
select t.*
from (select t.*, rank() over (partition by team order by date desc) as seqnum
from t
) t
where seqnum = 1;
在某些数据库中,具有正确索引的关联子查询会更快(我尚未使用Postgres进行过测试):
select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.team = t.team);
如果每个团队只需要一行,那么规范的答案是:
select distinct on (t.team) t.*
from t
order by t.team, t.date desc;
但是,在这种情况下这是行不通的,因为您需要最近日期的所有行。
答案 1 :(得分:0)
如果数据集很大,请在子查询中考虑$this->update(compact('completed'));
分析函数:
$this->update(['completed'=>$completed]);
通常,max
为O(n),因此它应该非常有效。我不假装知道PostgreSQL上的实际实现,但是我猜是O(n)。
答案 2 :(得分:0)
另一种可能性,通用的:
select * from t join (select max(date) date,team from t
group by team) tt
using(date,team)
答案 3 :(得分:0)
窗口功能是您的最佳解决方案。
select id
from (
select team, id, rank() over (partition by team order by date desc) as row_num
from table
) t
where row_num = 1
该查询将返回此表:
| id |
|----|
| 1 |
| 2 |
| 4 |
如果每个团队将其排成一行,则需要使用array_agg
函数。
select team, array_agg(id) ids
from (
select team, id, rank() over (partition by team order by date desc) as row_num
from table
) t
where row_num = 1
group by team
该查询将返回此表:
| team | ids |
|------|--------|
| A | [1, 2] |
| B | [4] |