代码之家  ›  专栏  ›  技术社区  ›  Sergey Stadnik

使用一个SQL来实现这一点

  •  1
  • Sergey Stadnik  · 技术社区  · 16 年前

    alt text

    行按CLNDR\U DATE DESC排序。


    并返回该组最后一行的CLNR_日期。

    通常我会打开一个光标,从上到下循环,直到在生效日期中找到空值。然后我就会知道我要寻找的日期是CLNDR_日期,在上一步中获得。

    但是,我想知道是否可以用一个SQL实现同样的功能?

    4 回复  |  直到 9 年前
        1
  •  7
  •   Jonathan Lonowski    16 年前

    警告:绝对不是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
      ))
    

    假设你想要 第一 具有 生效日期 .

    如果你想要 首先没有 ,将子查询更改为使用min()而不是max()。

        2
  •  1
  •   jop    16 年前

    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)

    (编辑:固定顺序)

        3
  •  0
  •   Wayne    16 年前

    此记录集的第一个结果就是您要查找的结果。根据您的数据库,您可能只能使用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
    
        4
  •  0
  •   Slava Slava    16 年前

    在Oracle环境中,可以使用分析功能( http://www.orafaq.com/node/55 ),这是非常强大的工具,可以执行您要求的查询。

    我认为使用标准SQL是不可能的,但也许一些SQL专家会给出一些不错的解决方案。