[英]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.