SQL - 在 PARTITION BY 语句中创建层次结构

Posted

技术标签:

【中文标题】SQL - 在 PARTITION BY 语句中创建层次结构【英文标题】:SQL - Creating hierarchy in PARTITION BY statement 【发布时间】:2014-10-20 19:37:59 【问题描述】:

我正在使用以下代码按 ID 号匹配行:

SELECT *,
    LEAD(ORDER, 1) OVER(PARTITION BY ID_NBR) AS PREV_ORDER
FROM TABLE

在我的数据中,缺少一些 ID 号。如果(且仅当)缺少 ID 号,我想按 Cust_Name 匹配行。这可以通过 LEAD/OVER 命令实现吗?

谢谢,

【问题讨论】:

不见了,你的意思是他们是NULL? ID_NBR 字段为空白。 你能定义“匹配”吗?什么是cust_nameorder 列在哪里出现?你知道order 是一个非法的列名,因为你有它吗?如果您先发布一个原始数据样本,然后发布另一个您想要的数据样本,并完整、合乎逻辑地描述如何将一个数据转换为另一个数据,这可能会使事情变得更容易。 【参考方案1】:

也许你需要这样的东西?

with tab as (
select 1 id, 'n1' cust_name from dual
union all select 2, 'n2' from dual
union all select null, 'n3' from dual
union all select 4, 'n4' from dual
)
select id, cust_name, 
           lag(cust_name ignore nulls) over(order by id) prev_name,
           lead(cust_name ignore nulls) over(order by id) next_name
from tab;

IGNORE NULLS - 在查找滞后/超前值时跳过 NULL 值。

您可以在 ORDER BY 之前添加“PARTITION BY col[,col]”

具有 LAG / LEAD 功能的 ORDER BY 是必不可少的

【讨论】:

以上是关于SQL - 在 PARTITION BY 语句中创建层次结构的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL的over partition by 开窗语句在分页和统计中的使用总

T-SQL-Sum over Partition by 与 group by 组合

利用SQL语句产生分组序号

数据仓库系列 之SQL中row_number() over (partition by)的详解

数据仓库系列 之SQL中row_number() over (partition by)的详解

【SQL】partition by