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_part
、id_finish
和 id_metal
列的组合).带有 id
34 的行我 不 想要 returned 在这个例子中因为它是 date
因为组合零件号比 id
36.
在客户端,它们的部件号可能看起来像“2990-01-22”,所以我需要只这三列的最新记录组合为一个基于单个有效列最新 date
。所以我需要查询 return id
36 和 37 的行。如果它有助于固有的 date
(date
类型)和 id
(serial
显然)行只会增加,所以 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
的两条记录永远不会有相同的值。
我正在尝试以获取 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_part
、id_finish
和 id_metal
列的组合).带有 id
34 的行我 不 想要 returned 在这个例子中因为它是 date
因为组合零件号比 id
36.
在客户端,它们的部件号可能看起来像“2990-01-22”,所以我需要只这三列的最新记录组合为一个基于单个有效列最新 date
。所以我需要查询 return id
36 和 37 的行。如果它有助于固有的 date
(date
类型)和 id
(serial
显然)行只会增加,所以 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
的两条记录永远不会有相同的值。