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

PostgreSQL SELECT latest date only for a combination of different columns

我正在尝试以获取 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;

...导致以下 returned 数据...

+----+---------+-----------+----------+----------------+------------+------+
| 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',尽管只有 return 部分记录(id_partid_finishid_metal 列的组合).带有 id 34 的行我 想要 returned 在这个例子中因为它是 date 因为组合零件号比 id36.

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

所以视觉上基于上面的 table 我需要查询 return 以下...

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

似乎 有效,但我需要继续使用更大量的数据进行测试。如果有人认为他们有更多 accurate/efficient 的答案,请随时 post。

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 的两条记录永远不会有相同的值。