我有一个返回类似内容的查询......
数据集1:
EFFECTIVE_DATE END_DATE DESC SUBPART
4/10/2011 Dairy Products Processing L
4/10/2011 360 CMR 10.000
4/1/2011 4/9/2011 Dairy Products Processing A
4/1/2011 4/9/2011 Ferroalloy Manufacturing A
我希望获得一个返回该数据集的查询......
数据集2:
EFFECTIVE_DATE END_DATE DESC SUBPART
4/10/2011 Dairy Products Processing L
360 CMR 10.000
4/1/2011 4/9/2011 Dairy Products Processing A
Ferroalloy Manufacturing A
请注意,重复生效日期(4/10/2011 - {null}和4/1/2011 - 4/9/2011)在重复时会被取消。
编辑1:回应@Justin Cave的回答,
以下是我与Justin Cave的模板合并的查询。它很接近,但有点偏。日期和描述看起来与它们应该是的有点混淆(数据集中的数据应该与数据集2中的数据相似:。我认为它可能与我的相关订购,但我不确定。
SELECT (CASE WHEN effective_date = prior_effective_date
THEN null
ELSE effective_date
END) effective_date,
(CASE WHEN end_date = prior_end_date
THEN null
ELSE end_date
END) end_date,
cfr_part_desc ,
cfr_subpart
FROM
(SELECT c.effective_date,
lag(c.effective_date) over (order by c.effective_date desc, cpl.cfr_part_desc asc) prior_effective_date,
c.end_date,
lag(c.end_date) over (order by c.effective_date desc, cpl.cfr_part_desc asc) prior_end_date,
cpl.CFR_PART_DESC as cfr_part_desc,
cd.CFR_SUBPART as cfr_subpart
from table1 c
inner join table2 cd ON c.IND_ID = cd.IND_ID
AND cd.EFFECTIVE_DATE = c.EFFECTIVE_DATE
inner join table3 cpl on cd.CFR_PART_L_S = cpl.CFR_PART_L_S
inner join table4 f on c.ind_id = f.ind_id
inner join table5 p on f.ind_id = p.ind_id
where p.PERMIT_S = '4988'
order by c.effective_date desc, cpl.CFR_PART_DESC asc
);
编辑2:错误的数据是由于模糊地定义了列生效日期。上面的查询现在可以正常工作。
答案 0 :(得分:4)
我认为你正在寻找使用分析函数的类似东西。我不清楚结果集是如何排序的,所以你必须填写它。你也可能能够将分析函数组合到你的查询中,而不是添加第三级嵌套。
SELECT (CASE WHEN effective_date = prior_effective_date
THEN null
ELSE effective_date
END) effective_date,
(CASE WHEN end_date = prior_end_date
THEN null
ELSE end_date
END) end_date,
description ,
subpart
FROM
(SELECT effective_date,
lag(effective_date) over
(order by effective_date desc, description asc) prior_effective_date,
end_date,
lag(end_date) over
(order by effective_date desc, description asc) prior_end_date,
desc,
subpart
FROM <<your query>>)
答案 1 :(得分:1)
如果您使用SQL * Plus生成输出,则可以使用BREAK
:
BREAK ON EFFECTIVE_DATE ON END_DATE
SELECT ...