代码之家  ›  专栏  ›  技术社区  ›  Landon Statis

月数介于/n值之间

  •  2
  • Landon Statis  · 技术社区  · 8 年前

    我希望将一些独特的逻辑放入查询中,而不必调用函数。

    在这个应用程序中,我将查看给定股票代码的最后4个报告季度。表中的日期表示为YYYYMM,在这种情况下:

    201804,
    201801,
    201710,
    201704
    

    现在,可能有四分之一不见了。也许公司没有提交季度报告,或者其他什么。

    所以,我要做的是看看是否有缺口,或者缺少一个季度:

    201804,
    201710,
    201704,
    201701
    

    这里,201801丢失了………我想不知何故,我必须能够比较当前记录日期和Lead1之间的月份,或者nth值1的日期值,并看到过去4个记录(4个季度)的差异是3个月……。如果没有,则缺少一些记录,我将返回一个空值,这是应用程序所需的。

    有什么想法或独特的逻辑吗?或者我需要编写一个函数并调用它?

    谢谢!!!!

    2 回复  |  直到 8 年前
        1
  •  0
  •   Juan Carlos Oropeza    8 年前

    只需将所有内容转换为日期,并使用带有自联接的日期操作

    SQL Fiddle

    With cte as (
      SELECT "val", 
              TO_DATE("val", 'YYYYMM') as original
      FROM Table1
    )
    SELECT c1."val", c1.original, 
           c2.original as next_quarter,
           c3.original as previous_quarter
    FROM cte c1
    LEFT JOIN cte c2
      ON c1.original = ADD_MONTHS(c2.original, -3)
    LEFT JOIN cte c3
      ON c1.original = ADD_MONTHS(c3.original, 3)
    
    ORDER BY c1."val"
    

    产量

    |    val |             ORIGINAL |         NEXT_QUARTER |     PREVIOUS_QUARTER |
    |--------|----------------------|----------------------|----------------------|
    | 201701 | 2017-01-01T00:00:00Z | 2017-04-01T00:00:00Z |               (null) |
    | 201704 | 2017-04-01T00:00:00Z |               (null) | 2017-01-01T00:00:00Z |
    | 201710 | 2017-10-01T00:00:00Z |               (null) |               (null) |
    | 201804 | 2018-04-01T00:00:00Z |               (null) |               (null) |
    
        2
  •  0
  •   Arijit Kanrar    8 年前

    您可以创建季度日历,并将此数据与季度数据进行外部联接。这就是查询的外观。这个 p_start_year 是日历开始的年份 p_no_of_qtrs 统计日历中显示的季度数。

    WITH
        mydata
        AS
            (SELECT '201804' AS quarter FROM DUAL
             UNION
             SELECT '201801' AS quarter FROM DUAL
             UNION
             SELECT '201710' AS quarter FROM DUAL
             UNION
             SELECT '201704' AS quarter FROM DUAL),
        calendar
        AS
            (SELECT TO_CHAR (
                        ADD_MONTHS (
                            TO_DATE (:p_start_year || '-01-01', 'YYYY-MM-DD'),
                            (LEVEL
                             - 1)
                            * 3
                        ),
                        'YYYYMM'
                    )
                        AS quarter
             FROM DUAL
             CONNECT BY LEVEL <= :p_no_of_qtrs)
    SELECT c.quarter, d.quarter AS status
    FROM mydata d,
         calendar c
    WHERE c.quarter = d.quarter(+)
    ORDER BY c.quarter;
    

    这就是结果。

    QUARTER | STATUS
    201701  | 
    201704  | 201704
    201707  | 
    201710  | 201710
    201801  | 201801
    201804  | 201804
    201807  | 
    201810  | 
    

    丢失的季度显示为空。