按日期间隔分组 Oracle

Posted

技术标签:

【中文标题】按日期间隔分组 Oracle【英文标题】:Group by date intervall Oracle 【发布时间】:2021-02-25 06:18:33 【问题描述】:

我想从一个表中检索整个月的重量数据总和。 我需要帮助的是我想将结果分为两部分 每月 1-15 的总和 以及当月的第二行 16-31。

SELECT(SUM(B.SCALE_WEIGHT) FROM TRACKING.DATALOG_TAB B WHERE B.MATERIALID= 1 AND B.SCALE_EVENTDATE BETWEEN TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'),'MONTH')) AND TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'), 'MONTH')+30)
GROUP BY(somthing like this - 1-15  and 16-31)

【问题讨论】:

【参考方案1】:

这是一种选择:

select
    1 + floor(extract(day from scale_eventdate) / 16) as fortnight,
    sum(b.scale_weight) as sum_scale_weight
from tracking.datalog_tab b 
where 
    materialid = 1 
    and scale_eventdate >= date '2020-10-01'
    and scale_eventdate <  date '2020-11-01'
group by 1 + floor(extract(day from scale_eventdate) / 16)

这会从日期中提取天数,然后使用算法:从该月的 1 日到 15 日的每一天都转到fortnight 编号1,之后的所有内容都转到存储桶2

我们也可以使用 to_char()case 表达式来做到这一点,这在某种程度上更具表现力:

select
    case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end as fortnight,
    sum(b.scale_weight) as sum_scale_weight
from tracking.datalog_tab b 
where 
    materialid = 1 
    and scale_eventdate >= date '2020-10-01'
    and scale_eventdate <  date '2020-11-01'
group by case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end

请注意,我将日期过滤逻辑更改为使用标准日期文字,这使得查询更短且更具可读性。

【讨论】:

那是正确的,但我想选择多列?另一列 fo materialId = 2 @B.j:这确实是一个不同的问题。如果是这样,您应该提出一个新问题。这回答了您提出的问题。 发了一个新的***.com/questions/64820490/…

以上是关于按日期间隔分组 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent - 按“从日期”到“至今”分组,间隔为 1 天

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

按日期间隔选择多行分组(导致重复)[重复]

SQL查询中按日期、天间隔分组

按日期间隔大于 X 的 DATETIME 获取数据、计数和分组

在 Oracle SQL 中按时间间隔聚合数据