【问题标题】:Oracle : Get average count for last 30 business daysOracle:获取过去 30 个工作日的平均计数
【发布时间】:2017-10-25 23:09:45
【问题描述】:

Oracle 版本 11g

我的表有类似的记录。

calendar_date   ID   record_count
25-OCT-2017      1   20
25-OCT-2017      2   40
25-OCT-2017      3   60
24-OCT-2017      1   70
24-OCT-2017      2   50
24-OCT-2017      3   10
20-OCT-2017      1   35
20-OCT-2017      2   60
20-OCT-2017      3   90
18-OCT-2017      1   80
18-OCT-2017      2   50
18-OCT-2017      3   45

即对于每个ID,给定日历日有一个记录计数。这些天连续,即可能缺少周末/节假日等的记录。在这样的日子里,将没有任何 ID 的可用记录。但是在工作日,每个 ID 都有可用的条目。

需要获取每个 id 的最后一个 30 business days 的平均记录数

我想要这样的输出。 (不要按价值观行事。这只是一个示例)

ID  avg_count_last_30
1    150
2    130
3    110

我正在尝试找出最有效的方法来做到这一点。我想过使用 RANGE BETWEENROWS BETWEEN 等,但不确定它是否会起作用。

当然,这样的查询无济于事,因为中间有假期。

select id, AVG(record_count) FROM mytable 
where calendar_date between SYSDATE - 30 and SYSDATE - 1
group by id;

我需要的是类似的东西

select id , AVG(record_count) FROM mytable 
    where calendar_date between last_30th_business_day and last_business_day
    group by id;

last_30th_business_day 将是 count(DISTINCT business_days ),从最近一个工作日开始倒退到我数到 30。

last_business_day 将是最近的工作日

想知道专家对此和最佳方法的意见。

【问题讨论】:

  • 如何获得假期日期?排除周末并不难,但您需要一个包含假期日期的表格作为参考。
  • 您需要更多关于特定压光机驱动的方法。您必须创建一个 Holiday 表并在查询中使用它。
  • 您每个工作日都有一个记录吗?
  • 很遗憾没有假期表。我需要纯粹按记录计数。但是,我们会确保在计算当天至少有过去 30 个工作日的记录
  • @WernfriedDomscheit:是的。每个工作日每个 ID 只有一条记录

标签: sql oracle


【解决方案1】:

根据您的评论,试试这个:

WITH mytable (calendar_date, ID, record_count) AS (
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 1, 20 FROM dual UNION ALL
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 2, 40 FROM dual UNION ALL
    SELECT TO_DATE('25-10-2017', 'DD-MM-YYYY'), 3, 60 FROM dual UNION ALL
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 1, 70 FROM dual UNION ALL
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 2, 50 FROM dual UNION ALL
    SELECT TO_DATE('24-10-2017', 'DD-MM-YYYY'), 3, 10 FROM dual UNION ALL
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 1, 35 FROM dual UNION ALL
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 2, 60 FROM dual UNION ALL
    SELECT TO_DATE('20-10-2017', 'DD-MM-YYYY'), 3, 90 FROM dual UNION ALL
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 1, 80 FROM dual UNION ALL
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 2, 50 FROM dual UNION ALL
    SELECT TO_DATE('18-10-2017', 'DD-MM-YYYY'), 3, 45 FROM dual),
t AS (
    SELECT calendar_date, ID, record_count,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY calendar_date desc) AS RN
    FROM mytable)
SELECT ID, AVG(RECORD_COUNT) 
FROM t
WHERE rn <= 30
group by ID;

【讨论】:

  • 我需要试试这个..会让你知道的。实际上,这是我的大型查询的一个组成部分,它有几个其他计算。让我们看看它们是如何协同工作的。
  • 谢谢..这适用于记录可用时间少于 30 天的情况。
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2014-10-30
相关资源
最近更新 更多