簡體   English   中英

根據 PostgreSQL 中最近的值組合多行

[英]Combining multiple rows based on recent values in PostgreSQL

我在這里的第一個問題,所以我會盡力解釋它。

我有一個特定的需求,我試圖提出一個查詢,但沒有成功。 也用谷歌搜索,並沒有找到它,但可能我的輸入不好,因為在我看來它應該沒有那么難。

所以我有一些表格和數據的例子(日期格式為 dd/MM/yyyy):

----------------------------------------------------------------------------
|   id    |   asset_id   |    value    |    start_date    |    end_date    |
----------------------------------------------------------------------------
|    1    |       1      |    value1   |    20-10-2020    |   31-10-2020   |
----------------------------------------------------------------------------
|    1    |       1      |    value1   |    01-11-2020    |   05-11-2020   |
----------------------------------------------------------------------------
|    1    |       2      |    value2   |    05-10-2020    |   10-10-2020   |
----------------------------------------------------------------------------
|    1    |       2      |    value3   |    10-10-2020    |   15-10-2020   |
----------------------------------------------------------------------------
|    1    |       3      |    value3   |    15-08-2020    |   31-08-2020   |
----------------------------------------------------------------------------
|    1    |       3      |    value1   |    01-09-2020    |   05-09-2020   |
----------------------------------------------------------------------------
|    1    |       3      |    value1   |    05-09-2020    |   10-09-2020   |
----------------------------------------------------------------------------

所以我的具體需要是查看按 id 和 asset_id 分組的最近行。 如果這兩行的值相同,則將行合並為一行,第一行的 start_date 和第二行的 end_date。 如果值不匹配,則不應執行任何操作。

對於特定的輸入(上表),一些期望的輸出應該是:

----------------------------------------------------------------------------
|   id    |   asset_id   |    value    |    start_date    |    end_date    |
----------------------------------------------------------------------------
|    1    |       1      |    value1   |    20-10-2020    |   05-11-2020   |
----------------------------------------------------------------------------
|    1    |       2      |    value2   |    05-10-2020    |   10-10-2020   |
----------------------------------------------------------------------------
|    1    |       2      |    value3   |    10-10-2020    |   15-10-2020   |
----------------------------------------------------------------------------
|    1    |       3      |    value3   |    15-08-2020    |   31-08-2020   |
----------------------------------------------------------------------------
|    1    |       3      |    value3   |    01-09-2020    |   10-09-2020   |
----------------------------------------------------------------------------

因此,對於值為 (1,1) 的組 (id, asset_id),輸入表中的兩行應按我的描述進行組合,因為它們的值相同。 所以第一行和第二行應該從輸出合並到第一行。 對於 (1,2) 組,​​值不同,因此不應進行合並。 對於 (1,3) 組,最近的行(輸入的第 6 行和第 7 行)應合並在輸出表的第 5 行中。

這似乎並不難,但我很難提出一些具體的問題。 我做了一個sqlfiddle ,任何人都可以嘗試。

任何幫助真的很感激。

您可以使用row_number()過濾每組的前兩行。 然后,按value聚合:如果組中的兩行具有相同的value ,則將它們分組在一起,否則最終分為兩個不同的組。

所以:

select id, asset_id, value, min(start_date) start_date, max(end_date) end_date
from (
    select t.*,
        row_number() over(partition by id, asset_id order by start_date desc) rn
    from mytable t
) t
where rn <= 2
group by id, asset_id, value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM