【发布时间】:2018-08-09 13:42:45
【问题描述】:
我一直在尝试一些事情。
如下所示,我有这些表(Application、Version、Record、record_version_application、History)
记录表包含每条活动记录。 历史记录包含非活动记录,并保留已编辑记录的历史记录。
我正在使用 Postgresql 10
表应用及版本:
+---------------------+-----------------------------+-----------------------+
| Table Application | | Table version |
+---------------------+-----------------------------+-----------------------+
| ip_app | nom_app | | id_version | version |
+--------+------------+-----------------------------+------------+----------+
| 10 | ABC | | 4 | 1.0.0.1 |
+--------+------------+-----------------------------+------------+----------+
| 13 | DEF | | 5 | 1.2.0.1 |
+--------+------------+-----------------------------+------------+----------+
| 20 | GHI | | 6 | 1.0.0.1 |
+--------+------------+-----------------------------+------------+----------+
| 28 | JKL | | 7 | 2.2.2.2 |
+--------+------------+-----------------------------+------------+----------+
| | | | 8 | 2.2.2.3 |
+--------+------------+-----------------------------+------------+----------+
| | | | 9 | 1.1.1.1 |
+--------+------------+-----------------------------+------------+----------+
表格记录:
+-----------+------------+-----------+
| id_record | start_date | end_date |
+-----------+------------+-----------+
| 5 | 2018-7-10 | 2018-7-12 |
+-----------+------------+-----------+
| 9 | 2018-7-15 | 2018-7-18 |
+-----------+------------+-----------+
| 10 | 2018-7-20 | 2018-7-30 |
+-----------+------------+-----------+
表记录_版本_应用程序
+-----------+------------+----------------+
| id_record | id_version | id_application |
+-----------+------------+----------------+
| 5 | 1.0.0.1 | 4 |
+-----------+------------+----------------+
| 9 | 1.2.0.1 | 8 |
+-----------+------------+----------------+
| 10 | 1.0.0.1 | 9 |
+-----------+------------+----------------+
表历史记录:
+------------+-----------+--------+---------+------------+-----------+
| id_history | id_record | id_app | version | start_date | end_date |
+------------+-----------+--------+---------+------------+-----------+
| 9 | 2 | 10 | 1.0.0.0 | 2017-6-25 | 2017-7-30 |
+------------+-----------+--------+---------+------------+-----------+
| 10 | 5 | 10 | 1.0.0.1 | 2018-7-15 | 2018-7-10 |
+------------+-----------+--------+---------+------------+-----------+
| 11 | 10 | 20 | 1.2.0.1 | 2018-7-18 | 2018-7-28 |
+------------+-----------+--------+---------+------------+-----------+
| 12 | 1 | 13 | 2.2.2.2 | 2018-5-10 | 2018-5-16 |
+------------+-----------+--------+---------+------------+-----------+
| 13 | 9 | 13 | 2.2.2.3 | 2018-7-5 | 2018-7-8 |
+------------+-----------+--------+---------+------------+-----------+
| 14 | 9 | 13 | 2.2.2.3 | 2018-7-12 | 2018-7-18 |
+------------+-----------+--------+---------+------------+-----------+
| 15 | 3 | 28 | 1.1.1.1 | 2018-7-12 | 2018-7-15 |
+------------+-----------+--------+---------+------------+-----------+
| 16 | 3 | 28 | 1.1.1.1 | 2018-8-12 | 2018-8-20 |
+------------+-----------+--------+---------+------------+-----------+
第一个提取结果应该是两个表之间的 UNION 查询。 如果两个表中都存在 [id_app/version] 对,则应该只保留记录表中的一对。
如果 History 表中有许多相同的 [id_app/version] 对,它应该只保留最后一个(也应该是插入数据库中的最后一个)。
第一个提取结果是这样的:
+--------+---------+------------+-----------+
| id_app | version | start_date | end_date |
+--------+---------+------------+-----------+
| 10 | 1.0.0.0 | 2017-6-25 | 2017-7-30 |
+--------+---------+------------+-----------+
| 10 | 1.0.0.1 | 2018-7-10 | 2018-7-12 |
+--------+---------+------------+-----------+
| 20 | 1.2.0.1 | 2018-7-20 | 2018-7-30 |
+--------+---------+------------+-----------+
| 13 | 2.2.2.2 | 2018-5-10 | 2018-5-16 |
+--------+---------+------------+-----------+
| 13 | 2.2.2.3 | 2018-7-15 | 2018-7-18 |
+--------+---------+------------+-----------+
| 28 | 1.1.1.1 | 2018-8-12 | 2018-8-20 |
+--------+---------+------------+-----------+
最终结果应该是使用 array_agg (Postgresql) GROUPED BY the id_app 的先前结果的聚合结果
最终期望的结果是:
+--------+--------------------+------------------------+------------------------+
| name_app| version | start_date | end_date |
+--------+--------------------+------------------------+------------------------+
| ABC | [1.0.0.0, 1.0.0.1] | [2017-6-25, 2018-7-10] | [2017-7-30, 2018-7-12] |
+--------+--------------------+------------------------+------------------------+
| GHI | [1.2.0.1] | [2018-7-18] | [2018-7-28] |
+--------+--------------------+------------------------+------------------------+
| DEF | [2.2.2.2, 2.2.2.3] | [2018-5-10, 2018-7-15] | [2018-5-16, 2018-7-18] |
+--------+--------------------+------------------------+------------------------+
| JKL | [1.1.1.1] | [2018-8-12] | [2018-8-20] |
+--------+--------------------+------------------------+------------------------+
注意start_date、end_date也可以为NULL
我只能实现其中的一部分,它只依赖于记录表而不是历史记录
SELECT a.name_app, array_to_json(array_agg(v.version ORDER BY version)) AS version,
array_to_json(array_agg(to_char(start_date, 'DD Mon YYYY') ORDER BY version)) AS start_date,
array_to_json(array_agg(to_char(end_date, 'DD Mon YYYY') ORDER BY version)) AS end_date
FROM record r NATURAL JOIN record_application_version NATURAL JOIN version v NATURAL JOIN application a
GROUP BY nom_app
ORDER BY nom_app;
我一直坚持使用 Record 和 History 表。
到目前为止,我一直在使用和尝试:
如果您有任何提示可以帮助我实现这一目标,我将不胜感激。 此外,如果您有任何其他建议,我会很乐意接受。
谢谢
PS:英语不是我的母语。如果有不清楚的地方告诉我,我会尽量说清楚。
【问题讨论】:
-
显示数据很好,显示太多信息是另一回事。您可能希望将您的问题简化为基本问题。
-
很多文字。你是想解决你的问题还是只是把你的任务放在这里?
-
@IgorCova 当然我做到了,我可以提供我尝试过的每一个请求,但我认为复制/粘贴我尝试过和失败的所有内容都无关紧要。正如你所说,已经有很多文字了......
-
@TimBiegeleisen 你是对的。老实说我不习惯在这里问,我通常在现有的问题/答案中找到我需要的一切。所以我不知道我应该给出什么来定义上下文。
标签: sql postgresql