我有一张看起来像这样的表:
行按CLNDR_DATE DESC排序。
我需要找到与突出显示的行对应的CLNDR_DATE,换句话说:
找到最顶层的行WHERE EFFECTIVE_DATE不为NULL,
并返回该组最后一行的CLNR_DATE。
通常我会打开一个光标并从上到下循环,直到我在EFFECTIVE_DATE找到一个NULL。然后我会知道我要找的日期是CLNDR_DATE,是在上一步获得的。
但是,我想知道使用单个SQL是否可以实现相同的目标?
答案 0 :(得分:7)
警告:无论如何不是DBA。 ;)
但是,快速,未经测试的刺伤:
SELECT min(CLNDR_DATE) FROM [TABLE]
WHERE (EFFECTIVE_DATE IS NOT NULL)
AND (CLNDR_DATE > (
SELECT max(CLNDR_DATE) FROM [TABLE] WHERE EFFECTIVE_DATE IS NULL
))
假设您希望在最后没有之后第一次 CLNDR_DATE EFFECTIVE_DATE。
如果您想在第一个没有之后第一个,请将子查询更改为使用min()而不是max()。
答案 1 :(得分:1)
使用Oracle的分析功能(未经测试)
select *
from
(
select
clndr_date,
effective_date,
lag(clndr_date, 1, null) over (order by clndr_date desc) prev_clndr_date
from table
)
where effective_date is null
lag(clndr_date, 1, null) over (order by clndr_date desc)
返回前一个clndr_date,如果这是第一行,则使用null。
(编辑:固定顺序)
答案 2 :(得分:0)
此记录集的第一个结果是您正在寻找的。根据您的数据库,您可能只能使用LIMIT或TOP
返回此行SELECT CLNDR_DATE
FROM TABLE
WHERE CLNDR_DATE > (SELECT MAX(CLNDR_DATE)
FROM TABLE
WHERE EFFECTIVE_DATE IS NOT NULL)
ORDER BY CLNDR_DATE
答案 3 :(得分:0)
当你在Oracle环境中时,你可以使用分析函数(http://www.orafaq.com/node/55),它们是你要求的那种查询的非常强大的工具。
使用标准SQL我认为这是不可能的,但也许一些SQL大师会出现一些不错的解决方案。