sql - 如何从sql中的列中减去数据
问题描述
早上好我想如果你能帮我在 SQL 或 Postgresql 中进行查询,我有一列包含以下数据
" | Old 0.00 New 50.2 F20190429093143 | Old 50.20 New 50.2 F20191111151118 | Old 50.20 New 50.2 F20191202110735 | Old 50.20 New 53.2 F20201124173459 | Old 53.2 New 158.63 F20201125093143"
我想要得到的是最后 3 个更新,也就是说,我们显示最后 3 个“| Old ...”,我保留了类似的内容
| Old 50.20 New 50.2 F20191202110735 | Old 50.20 New 53.2 F20201124173459 | Old 53.2 New 158.63 F20201125093143
我想不出如何进行查询以取回该值
解决方案
假设您的表中还有一些唯一的键/列,以下 hack 将实现您想要的:
with entries as (
select t.id,
x.entry,
regexp_split_to_array(x.entry, '\s+') as items
from horribly_designed_table t
cross join regexp_split_to_table(t.line, '\s{0,1}\|\s*') as x(entry)
where nullif(trim(x.entry),'') is not null
), numbered as (
select id,
entry,
to_timestamp(items[5], '"F"yyyymmddhh24miss') as ts,
row_number() over (partition by id order by to_timestamp(items[5], '"F"yyyymmddhh24miss') desc) as rn
from entries
)
select id, string_agg(entry, ' | ' order by ts) filter (where rn <= 3) as new_line
from numbered
group by id;
第一个 CTE 将该行分成多行,每个“条目”一个。它还为每个条目创建一个项目数组。
然后,第二个 CTE 使用窗口函数根据最后一个“项目”(转换为时间戳)计算排名。
最后,每个 ID 的“最后 3 个条目”然后聚合回一行。
推荐阅读
- flutter - 如何在云端构建 Flutter APK 并获取可下载链接?
- tcl - TCL中的类似PsExec.exe
- python - AttributeError:'NoneType' 对象在尝试执行 resnet 时在 Keras 中没有属性 '_inbound_nodes'
- javascript - 递归函数无法正确评估对象中的键
- java - 如何使用 android studio 中的开放街道地图将文件保存在 geojson 中?
- javascript - 如何使用 jest 和酶测试框架访问内部反应组件和模拟 api 调用?
- python - 使用 Apache Beam 从 Google Cloud Datastore 批量读取记录
- mysql - MySQL查询基于相关表中的第二个关系时如何获得一对多的结果?
- macos - 如何在 macOS 中设置自定义“打开最近”子菜单
- ansible - 使用 import_playbook 时未定义的变量