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_name
? order
列在哪里出现?你知道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中row_number() over (partition by)的详解