首页 > 解决方案 > SQLite - 将行组合成新列

问题描述

我正在尝试使用我自己的文本消息在 Python 3.9 中创建一个聊天机器人,但无法正确格式化我的数据。

我有一个如下所示的短信表:

row_id 类型 日期 文本
1 进货 2020-08-10 08:09:18 你好
2 传出 2020-08-10 08:11:04 你好
3 进货 2020-08-10 08:11:12 为了明天
4 进货 2020-08-10 08:11:20 我们还在吃饭吗?
5 传出 2020-08-10 08:11:31 让我检查一下。
6 传出 2020-08-10 08:11:43 是的
7 进货 2020-08-10 08:11:45 伟大的!

我需要做的是将最后一个和下一个传出之间的所有传入文本以及最后一个和下一个传入之间的所有传出文本合并到一个列中。

例如,上表应如下所示:

进货 传出
你好 你好
明天我们还在吃晚饭吗? 让我检查一下。是的
伟大的

对话有超过 17,000 条记录。我使用 sqlite3 在 Python 3.9 中运行它。

我将如何完成这项任务?

标签: pythonsqlsqlite

解决方案


您可以使用分析函数和条件聚合,如下所示:

Select group_concat(case when type = 'incoming' then text end, ' ') as incoming_msg,
       Group_concat(case when type = 'outgoing' then text end, ' ') as outgoing_msg
  From
(Select t.*,
       Sum(case when type = lg_type then 0 else 1 end) over (order by date) as sm
  From
(Select t.*,
       Lag(type) over (order by date) as lg_type
  From t) t) t
Group by sm

推荐阅读