【问题标题】:Selecting more info from the same row after using GROUP BY使用 GROUP BY 后从同一行中选择更多信息
【发布时间】:2015-11-17 16:53:37
【问题描述】:

我有一个表格,例如,包含以下数据:

id | value | name   | date
1  | 1     | 'one'  | 2015-01-02
2  | 1     | 'two'  | 2015-02-03
3  | 2     | 'three'| 2014-01-03
4  | 2     | 'four' | 2014-01-02

对于每个不同的值,我想要具有最新日期的行的名称。所以:

value | name   | date
1     | 'two'  | 2015-02-03
2     | 'three'| 2014-01-03

我目前有这个查询:SELECT value, MAX(date) FROM table GROUP BY value,它为我提供了我正在寻找的值和日期列。如何修改查询以添加名称字段?简单地将它添加到 SELECT 子句是行不通的,因为 Postgres 会(可以理解)抱怨我必须将它添加到 GROUP BY 子句中。但是这样做会将其添加到唯一性检查中,并且我的查询将返回所有 4 行。我只需要找到最新日期的行的名称。

【问题讨论】:

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


【解决方案1】:

distinct on() 是使用 Postgres 执行此操作的最有效方式

select distinct on (value) id, value, name, date
from the_table
order by value, date;

SQLFiddle 示例:http://sqlfiddle.com/#!15/dff68/1

【讨论】:

  • 完美,这正是我需要的!
【解决方案2】:

这将为您提供所有必填字段:

select t1.* from table t1 
inner join (
  SELECT value, MAX(date) as date FROM table GROUP BY value
 )t2 on t1.date=t2.date;

SQL 小提琴:http://sqlfiddle.com/#!15/9491f/2

【讨论】:

  • 我不这么认为。我想要一个MAX(date),而不是MAX(id),这意味着我无法完成你提议的加入。
  • 如果单个值有两个相同的日期怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多