【问题标题】:Sql query to return a chain of eventssql查询返回事件链
【发布时间】:2019-03-15 19:47:05
【问题描述】:

我有一个跟踪变化的表。一列称为前名,另一列称为后名。

一些样本数据可能是:

BeforeName   AfterName
a            b
b            c
c            d

我正在尝试编写一个以返回更改的方式自我引用自身的查询,即:

a->b->c->d(这里的箭头只是表示)

这可以在 SQL 中实现吗?

我的数据库是 Sqlite

TIA

【问题讨论】:

  • 如果有帮助,我愿意接受架构更改

标签: sql sqlite


【解决方案1】:

事实上,您可以使用递归 CTE。假设没有循环:

with cte as (
      select beforename, aftername as lastone, beforename || '->' || aftername as path, 1 as lev
      from t
      where not exists (select 1 from t t2 where t2.aftername = t.beforename)
      union all
      select cte.beforename, t.aftername as lastone, path || '->' || aftername, lev + 1
      from cte join
           t
           on cte.lastone = t.beforename
     )
select *
from cte
where lev = (select max(cte2.lev) from cte cte2 where cte2.beforename = ce.beforename);

或者,如果您的 SQLite 版本支持窗口函数:

select *
from (select cte.*, row_number() over (partition by beforename order by lev desc) as seqnum
      from cte
     ) x
where seqnum = 1;

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2014-11-03
    • 2012-02-19
    • 2017-05-21
    • 2022-01-01
    • 2017-12-01
    相关资源
    最近更新 更多