通過 SQL,我試圖從中得到:
| ID | group_id | session_id | 欄位標簽 | 欄位值 | sent_at |
|---|---|---|---|---|---|
| 1 | 磨砂片 | 藍色碗 | 名 | 鮑勃 | 2022-11-05 18:18:19.093 |
| 2 | 磨砂片 | 藍色碗 | 名 | 鮑比 | 2022-11-05 18:17:31.274 |
| 3 | 磨砂片 | 藍色碗 | 姓 | 棕色的 | 2022-11-05 18:17:16.241 |
| 4 | 磨砂片 | 藍色碗 | 姓 | 勃朗寧 | 2022-11-05 18:15:34.492 |
| 5 | 磨砂片 | 藍色碗 | 姓 | 布朗森 | 2022-11-05 18:14:58.465 |
| 6 | 干杯 | 綠杯 | 名 | 克里斯汀 | 2022-11-05 18:18:58.222 |
| 7 | 干杯 | 綠杯 | 姓 | 圣誕節 | 2022-11-05 18:20:41.212 |
| 8 | 干杯 | 綠杯 | 姓 | 克里斯托弗森 | 2022-11-05 18:24:58.222 |
在哪里
id是獨特的group_id不是唯一的session_id不是唯一的
對此:
| group_id | session_id | 合并欄位 |
|---|---|---|
| 磨砂片 | 藍色碗 | 鮑勃布朗 |
| 干杯 | 綠杯 | 克里斯汀·克里斯托弗森 |
我知道field_label我想要合并的 s,并且我想獲得基于sent_at分組的每個合并欄位標簽的最新值group_id。
因此,對于組磨砂薄片,我想獲得field_value與field_label first_name (Bob) 相關聯的最新資訊field_value和與field_label last_name (Brown) 相關聯的最新資訊。
并重復。
我嘗試了交叉連接,也嘗試了類似于此執行緒的內部連接。但我不斷得到所有組合:/
uj5u.com熱心網友回復:
您可以使用ROW_NUMBER具有條件聚合的函式,如下所示:
SELECT group_id, session_id,
CONCAT_WS(' ',
MAX(CASE WHEN field_label='first_name' AND rn=1 THEN field_value END),
MAX(CASE WHEN field_label='last_name' AND rn=1 THEN field_value END)
) AS amalgamated_field
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY group_id, session_id, field_label ORDER BY sent_at DESC) rn
FROM table_name
) T
GROUP BY group_id, session_id
ORDER BY group_id
查看演示。
uj5u.com熱心網友回復:
在 Postgres 中,我建議使用distinct on字串聚合:
select group_id, session_id,
string_agg(field_value, ' ' order by field_label) full_name
from (
select distinct on (group_id, session_id, field_label) t.*
from mytable t
order by group_id, session_id, field_label, sent_at desc
) t
where field_label in ('first_name', 'last_name')
group by group_id, session_id
子查詢回傳每個組/會話/標簽元組的distinct on最新行。在外部查詢中,我們過濾我們感興趣的兩個標簽,并聚合每個組/會話元組的欄位值。的order by子句string_agg確保名字和姓氏按順序連接。
uj5u.com熱心網友回復:
您可以首先找到每個 的最大時間戳field_label,然后join將原始表的自我執行回最大時間戳,聚合field_value每個 的 s group_id:
select t1.group_id, t2.session_id, string_agg(t2.field_value,' ')
from (select t.group_id, t.field_label, max(t.sent_at) d
from tbl t group by t.group_id, t.field_label) t1
join tbl t2 on t1.d = t2.sent_at group by t1.group_id, t2.session_id
見小提琴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529135.html
下一篇:通過匯總建立總收入
