【问题标题】:Agregate data from different tables聚合来自不同表的数据
【发布时间】: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


【解决方案1】:

在两个表 A 和 B 之间构造一个联合 C,其中 C 包含 A 的每一行和 B 中不在 A 中的行。

有一个记录、版本、应用程序、record_application_version 的 JOIN 表 和 B 历史表。

我已经用这样的 WHERE NOT EXISTS 查询解决了我的问题:

SELECT * FROM A
UNION
SELECT * FROM B R1
    WHERE NOT EXISTS
        SELECT * FROM A
            WHERE A.value = B.value;
    AND NOT EXISTS 
    (SELECT * FROM R2
         WHERE R1.date_value < R2.date_value AND R1.id_app = R2.id_app);

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多