使用单个SQL执行此操作

时间:2008-10-02 06:29:39

标签: sql oracle

我有一张看起来像这样的表:

alt text

行按CLNDR_DATE DESC排序。

我需要找到与突出显示的行对应的CLNDR_DATE,换句话说:
找到最顶层的行WHERE EFFECTIVE_DATE不为NULL, 并返回该组最后一行的CLNR_DATE。

通常我会打开一个光标并从上到下循环,直到我在EFFECTIVE_DATE找到一个NULL。然后我会知道我要找的日期是CLNDR_DATE,是在上一步获得的。

但是,我想知道使用单个SQL是否可以实现相同的目标?

4 个答案:

答案 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大师会出现一些不错的解决方案。