Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 减少历史状态表的粒度?_Sql_Postgresql_Join_Data Warehouse_Snowflake Cloud Data Platform - Fatal编程技术网

Sql 减少历史状态表的粒度?

Sql 减少历史状态表的粒度?,sql,postgresql,join,data-warehouse,snowflake-cloud-data-platform,Sql,Postgresql,Join,Data Warehouse,Snowflake Cloud Data Platform,我有一个表,其中包含项目任务的基本历史日志 每一行包含项目的ID以及一个特定任务的开始或结束日期 我需要减少粒度,以便所有开始/结束时间都在一行中(请参见图中的IDS1和IDS2) 但让我吃惊的是,有些行可能有重复的任务条目,但时间戳不同——这意味着用户必须返回并重做任务。对于这些,我只需要该特定列的最新时间戳(请参见图中的ID3) 还有一个表包含项目的ID,该表是此项目的主表。我尝试过使用左连接,但似乎无法获得最新的时间戳 到目前为止,我一直在这样做: SELECT ID, a1.A_STA

我有一个表,其中包含项目任务的基本历史日志

每一行包含项目的ID以及一个特定任务的开始或结束日期

我需要减少粒度,以便所有开始/结束时间都在一行中(请参见图中的IDS1和IDS2)

但让我吃惊的是,有些行可能有重复的任务条目,但时间戳不同——这意味着用户必须返回并重做任务。对于这些,我只需要该特定列的最新时间戳(请参见图中的ID3)

还有一个表包含项目的ID,该表是此项目的主表。我尝试过使用左连接,但似乎无法获得最新的时间戳

到目前为止,我一直在这样做:

SELECT ID, a1.A_START, a2.A_END [...] c2.C_END FROM PROJECT
LEFT JOIN (SELECT ID, A_START FROM PROJECT_TASK ORDER BY A_START DESC) a1 ON a1.ID = p.ID
LEFT JOIN (SELECT ID, A_END FROM PROJECT_TASK ORDER BY A_END DESC)     a2 ON a2.ID = p.ID
LEFT JOIN (SELECT ID, B_START FROM PROJECT_TASK ORDER BY B_START DESC) b1 ON b1.ID = p.ID
...
LEFT JOIN (SELECT ID, C_END FROM PROJECT_TASK ORDER BY C_END DESC)     c2 ON c2.ID = p.ID
很明显,这并没有达到预期的效果,因为我需要删除所有重做过的旧任务,而这正是我被卡住的地方

任何提示或建议都将不胜感激

注意:两个表都不能更改-我只能根据给定的数据创建一个新的事实表



免责声明:很可能以前也有人问过类似的问题,但我想不出具体问什么会产生任何有用的结果。如果有人链接到类似的帖子,我将编辑此邮件,将该链接作为未来用户的参考。

您可以在所有这6列上使用聚合。您可以根据需要更改列名和别名

select id, max(col1), max(col2), max(col3), max(col4), max(col5), max(col6)
from your_table
group by id;

您可以在所有这6列上使用聚合。您可以根据需要更改列名和别名

select id, max(col1), max(col2), max(col3), max(col4), max(col5), max(col6)
from your_table
group by id;