设置要重复的行值,直到下一个实例



我收到了一个包含各种屏幕及其部分和部分ID值以及排序顺序的表格。 一种类型的部分是标题,每个屏幕可以有多个。 我需要在表中添加一列作为关联的标题,当找到下一个标题时,它将重置。

我尝试使用滞后和领先,但它只回顾或前进一条记录,并且屏幕上的部分数是可变的,并且总是超过 1。

SELECT SCREEN, ID, TYPE, SORT
, LAG(ID) OVER (ORDER BY SORT) PREVIOUS_TYPE
, LEAD(ID) OVER (ORDER BY SORT) NEXT_TYPE
, CASE WHEN ID LIKE 'X%' THEN ID
ELSE LAG(ID) OVER (ORDER BY SORT) END HEADING
FROM T_1
ORDER BY SORT;

源数据:

屏幕 ID 类型 排序输入 X1 标题 1 输入 C123 查找结果 2 输入 D937 文本 3 输入 X2 标题 4 输入 C31 搜索 5 输入 G876 负 6 输入 M3838 风险 7 输出 X3 标题 8 输出 G72 地图 9

预期输出:

屏幕标题 ID 类型 排序输入 X1 X1 标题 1 输入 X1 C123 查找结果 2 输入 X1 D937 文本 3 输入 X2 X2 标题 4 输入 X2 C31 搜索 5 输入 X2 G876 负 6 输入 X2 M3838 风险 7 输出 X3 X3 标题 8 输出 X3 G72 地图 9

您可以使用窗口函数。 . .两个级别。 第一个根据标题的累积计数分配组。 第二个分配值:

select t.*,
max(case when type = 'Heading' then id end) over (partition by grp) as heading_id
from (select t.*,
sum(case when type = 'Heading' then 1 else 0 end) over (order by sort) as grp
from t
) t;

如果您碰巧知道标题 ID 正在增加(如问题中的数据),则可以使用累积max()

select t.*
max(case when type = 'Heading' then id end) over (order by sort) as heading_id
from t;

我会尝试将其分解为多个部分 - 首先获取唯一的标题,然后将它们连接到其余数据。我想不出一种通过简单连接来使其工作的方法,所以我改用apply

with headings as (
select SCREEN, [ID], [SORT]
from T_1
where [TYPE] = 'Heading'
)
select t_1.[SCREEN], h_1.HEADING, t_1.[ID], t_1.[TYPE], t_1.[SORT]         
from t_1
outer apply (
select top 1 h.[ID] AS HEADING
from headings h
where h.[SCREEN] = t_1.[SCREEN]
and h.[SORT] <= t_1.[SORT]
order by h.[SORT] desc
) h_1

http://sqlfiddle.com/#!18/fbb75/5

这应该可以工作:

SELECT t.SCREEN, t.ID, t.TYPE, t.SORT,
(SELECT  TOP 1 h.ID  FROM T_1 h WHERE h.SCREEN=t.SCREEN AND h.SORT<=t.SORT AND h.TYPE='Heading' ORDER BY h.SORT DESC) AS HEADING
FROM T_1 t

最新更新