【问题标题】:maximum date less than the quarter date最大日期小于季度日期
【发布时间】:2022-11-03 23:19:24
【问题描述】:

我有表天表。有 oper_day 列:

oper_day
01.01.2021
02.01.2021
03.01.2021
**********
**********
31.12.2022

我想输出小于每个季度的第一个日期的表中可用的最大日期例如:Quarter_date: 01.10.2022 如果表中有 30.09.2022 我给 30.09.2022 否则 29.09.2022 。我该如何编写查询?

【问题讨论】:

  • select max(oper_day) from t where oper_day < date '2022-10-01'?
  • 没那么简单。请阅读得更好。
  • @MiralisherMirxomidov 上述建议有什么问题?你有什么输入?你想要什么作为输出:一个日期,每季度一个日期?
  • 从表中的可用日期中,需要一个小于每个季度开始日期的最大日期。
  • 如果表在 2022-01-01 之后没有行,那么截至今天(2022 年第四季度)的输出应该是什么?

标签: sql oracle


【解决方案1】:

您似乎在问如何找到每个季度的最后一个日期,如果是这样,那么 GROUP BY 数据 TRUNCated 到季度开始并找到每个季度的最大日期(因为它将是之前的最新日期下个季度的开始)。

如果要确保值来自当前季度之前的季度,则可以添加 WHERE 过滤器以忽略当前季度或更晚的值。

像这样:

SELECT TO_CHAR(TRUNC(oper_day, 'Q'), 'YYYY-Q') AS quarter,
       MAX(oper_day) AS last_oper_day_in_quarter
FROM   table_name
WHERE  oper_day < TRUNC(SYSDATE, 'Q')
GROUP BY TRUNC(oper_day, 'Q')

其中,对于样本数据:

CREATE TABLE table_name (oper_day) AS
SELECT DATE '2022-01-01' + LEVEL - 1
FROM   DUAL
CONNECT BY DATE '2022-01-01' + LEVEL - 1 <= SYSDATE;

输出:

QUARTER LAST_OPER_DAY_IN_QUARTER
2022-1 31-MAR-22
2022-2 30-JUN-22
2022-3 30-SEP-22

fiddle

【讨论】:

    【解决方案2】:

    可以通过按季度将日期分组来实现这一点。然后,对季度内的日期进行排名,以找出季度开始与该季度内的日期之间的最大差异。这可以通过使用来完成DENSE_RANK按降序对值进行排序,然后 KEEP clause 保留每个期间的最大日期差异。

    SELECT   ADD_MONTHS(TRUNC(td.oper_day, 'Q'), 3) next_quarter_begin
            ,MAX(td.oper_day) KEEP (DENSE_RANK FIRST ORDER BY td.oper_day - TRUNC(td.oper_day, 'Q') DESC) max_date_prev_quarter
    FROM     table_days td
    GROUP BY ADD_MONTHS(TRUNC(td.oper_day, 'Q'), 3)
    ORDER BY 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多