如何基于同一表列中的值在SQL中进行SELECT?

时间:2019-01-12 19:22:27

标签: sql postgresql

我有下表

| 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

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]    |