PostgreSQL SELECT最新日期仅适用于不同列的组合

时间:2015-01-08 15:38:48

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

我试图以获取id_description的所有实例但仅基于date列的最新行的方式查询数据。

我最近的查询尝试是......

SELECT DISTINCT ON (id) id, id_part, id_finish, id_metal, id_description, MAX(date) AS date, sort 
FROM parts_finishing 
WHERE id_description='3' 
GROUP BY id 
ORDER BY id DESC;

...导致以下返回的数据...

+----+---------+-----------+----------+----------------+------------+------+
| id | id_part | id_finish | id_metal | id_description | date       | sort |
+----+---------+-----------+----------+----------------+------------+------+
| 37 | 2997    | 1         | 12       | 3              | 2015-01-08 | 1    |
+----+---------+-----------+----------+----------------+------------+------+
| 36 | 2990    | 1         | 22       | 3              | 2015-01-07 | 2    |
+----+---------+-----------+----------+----------------+------------+------+
| 34 | 2990    | 1         | 22       | 3              | 2013-01-07 | 1    |
+----+---------+-----------+----------+----------------+------------+------+

我需要所有行WHERE id_description='3',但只返回该部分的一条记录(id_partid_finishid_metal列的组合)。我希望在此示例中返回id 34 的行,因为合并后的部件号的date早于{{1} 36。

在客户端,他们的部件号可能看起来像2990-01-22'所以我需要 这三个列的最新记录组合成一个基于最新id的单个有效列。所以我需要查询返回date 36和37的行。如果它有助于固有的iddate类型)和dateid )行只会增加,所以serial行不可能从其初始值改变。

所以基于上面的表格,我需要查询返回以下内容...

date

1 个答案:

答案 0 :(得分:0)

这个似乎可以工作,虽然我需要继续使用更大量的数据进行测试。如果有人认为他们有更准确/有效的答案,请随时发布。

SELECT DISTINCT ON (id_description, sort) 
pf.id, id_description, date, description, inside_hours_k, inside_rate, outside_material, sort 
FROM parts_finishing AS pf 
LEFT JOIN parts_finishing_descriptions AS fd ON (pf.id_description=fd.id) 
WHERE pf.id_part='1013' AND pf.id_finish='6' AND pf.id_metal='30' AND date>'2013-12-31' AND date<'2015-01-01' 
ORDER BY sort ASC;

我不得不修改答案,虽然我也意识到sort列自然是DISTINCT可以发言,因为同一date的两个记录都没有相同值。