【问题标题】:Adding intervals as part of an SQL statement添加间隔作为 SQL 语句的一部分
【发布时间】:2015-11-04 12:24:22
【问题描述】:

这里很长,因为我不确定这是否可能 - 如果是,那么我肯定欠你们。

我有一张包含 start_date、end_date 和 hours 的表格。考虑我有一行 start_date 2015 年 1 月 1 日,end_date 2015 年 12 月 31 日,小时数为 120。 我想生成 12 行的结果,每行和月份各 10 小时

类似

|Jan 15|10|
|Feb 15|10|
...
|Dec 15|10|

我想要十个,因为我将 120 小时除以月数 (12)。 120 / 12 = 10

我可以这样做吗?或者类似的东西?我怀疑我可能不得不在代码中而不是在 SQL 中进行 ETL。有没有人对我如何才能更接近我想要的东西有任何想法?

谢谢

【问题讨论】:

    标签: sql oracle oracle11g etl


    【解决方案1】:

    您只需要一个数字表。如果你有,你可以这样做:

    select add_months(start_date, n.n - 1),
           val / (months_between(start_date, end_date) + 1)
    from t join
         numbers n
         on add_months(start_date, n.n - 1) <= end_date;
    

    您可以通过多种方式创建numbers 表。一个简单的方法是这样的:

    with numbers as (
          select rownum as n
          from t
          where rownum <= 100
         )
    

    【讨论】:

    • 感谢@gordonlinoff 的回复。如果我使用“with...”创建数字表,它会仅为该交易创建它吗?我想在产品数据库上运行这个 SQL,所以不想影响这个。谢谢
    • 这里的rownum 技巧是Oracle 的一个row generator technique。这些技术不会在数据库中创建真正的表,只会在您的主查询中使用临时数据集。也许@Gordon 可以编辑答案以包含行生成器的完整查询?
    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2021-12-24
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多