使用 GROUP BY 后从同一行中选择更多信息
Selecting more info from the same row after using GROUP BY
我有一个 table 包含,例如,这个数据:
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
子句中。但是这样做会将其添加到唯一性检查中,并且我的查询将 return 所有 4 行。我只需要它找到最新日期的行的名称。
这将为您提供所有必填字段:
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 Fiddle: http://sqlfiddle.com/#!15/9491f/2
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
我有一个 table 包含,例如,这个数据:
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
子句中。但是这样做会将其添加到唯一性检查中,并且我的查询将 return 所有 4 行。我只需要它找到最新日期的行的名称。
这将为您提供所有必填字段:
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 Fiddle: http://sqlfiddle.com/#!15/9491f/2
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