首页 > 解决方案 > 如何从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

我想不出如何进行查询以取回该值

标签: sqlpostgresql

解决方案


假设您的表中还有一些唯一的键/列,以下 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 个条目”然后聚合回一行。

在线示例


推荐阅读