【发布时间】: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 BETWEEN , ROWS 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 只有一条记录