sql - 在 Postgres 中加入 Range
问题描述
我有一个像这样的 PostgreSQL 数据库表:
ID | Meal |Person
--------------------------------
1 | Early Beakfast | Abc
2 | Breakfast | Abc
3 | Lunch | Abc
4 | Afternoon Snack | Abc
5 | Evening Snack | Abc
7 | Dinner | Abc
8 | late Night Snack| Abc
9 | Afternoon Snack | Def
10 | Evening Snack | Def
我想要这样的输出:
Anchor | Before | After | Person
----------------------------------------------------------------
Afternoon Snack | Early Breakfast | Evening Snack | Abc
Afternoon Snack | Breakfast | Dinner | Abc
Afternoon Snack | Lunch | Late Night Snack | Abc
Afternoon Snack | NULL | Evening Snack | Def
获得此结果的最佳方法是什么?
我曾尝试在 ID IN (ID+1, ID+2,...ID+N) 上使用自加入,但这不可行。注意:这只是一个示例数据。实际数据包含 2M+ 条记录。但是,锚点保持不变。
解决方案
根据下午点心的数量(累积总和)创建组,然后聚合:
select 'Afternoon Snack',
max(case when seqnum = 0 then meal end) as before,
max(case when seqnum = 1 then meal end) as after
from (select t.*,
row_number() over (partition by person, grp, (meal <> 'Afternoon Snack') order by id) as seqnum
from (select t.*,
count(*) filter (where meal = 'Afternoon Snack') over (partition by person order by id) as grp
from t
) t
) t
where grp in (0, 1)
group by person, seqnum
order by person, seqnum;
推荐阅读
- c# - 如何检查 DataGridComboBoxColumn 是否为空?
- react-native - React Native 64.2 无法使用应用中心管道构建
- sql - 如何根据 Id 从多个表中获取值并基于 id 创建新表
- solidity - 如何签订合同来批准用户操纵她的代币?
- shell - ffmepg 获取并非所有 jpg 文件
- c# - 使用 Automapper 或 Dapper 在 JSON 中映射一个属性?在哪一层?
- swift - 在 Swift 中将数据传递给 dispatchGroup.notify
- class - 如何在kotlin中将类作为函数参数传递
- amazon-ec2 - 限制 terraform 嵌套资源中的 AWS 安全组设置
- flutter - 当索引值在可观察的列表上为真时,卡片颜色不会改变