【问题标题】:Select part of an integer in SQL (GBQ)在 SQL (GBQ) 中选择整数的一部分
【发布时间】:2021-09-03 09:46:08
【问题描述】:

我在 Google Big Query (SQL Standard) 上有以下数据库,其中包含日期和收入。两者都是 int 格式。我需要按月和年获取总数。我无法获得我感兴趣的日期部分。基本上是第一列中位置 1 和 6 的数字。

收入数据库:

这是我尝试过的,但是我需要每个月单独运行这段代码:

SELECT sum(revenue)
from revenue.table
where date between 20210601 and 20210630

关于如何做到这一点的任何线索?谢谢!

【问题讨论】:

  • 将日期存储为整数值的设计选择不佳。更改日期数据类型,一切都会变得更容易。
  • 您使用的是哪个 dbms?
  • 您还没有告诉我们您使用的是哪个 dbms...
  • 另外,这里的大多数人希望样本表数据和预期结果为格式化文本,而不是图像。
  • 正如@jarlh 多次询问的那样,答案取决于您的 DBMS

标签: sql google-bigquery integer extract


【解决方案1】:

如果值是int格式,则使用算术:

select floor(date / 100) as yyyymm, sum(revenue)
from revenue.table
group by yyyymm;

如果它被正确存储为date,那么您将使用内置的date_trunc()

select date_trunc(date, month) as yyyymm, sum(revenue)
from revenue.table
group by yyyymm;

相关数据类型有类似的函数:timestamp_trunc()datetime_trunc()

【讨论】:

    【解决方案2】:

    如果您的date 实际上是INTEGER,那么我会:

    GROUP BY DIV(date/100)

    【讨论】:

      【解决方案3】:

      我会选择下面

      select 
        date_trunc(parse_date('%Y%m%d', '' || date), month) month,
        sum(revenue) revenue
      from `revenue.table`
      group by month
      

      【讨论】:

        【解决方案4】:

        试试这个:

        SELECT substring(cast(Date as string),1,6) YearMonth,
               sum(Revenue)
        FROM `<Dataset_NAME>.<Table_NAME>`
        group by YearMonth;
        
        

        【讨论】:

        【解决方案5】:

        添加我自己的解决方案以防将来对某人有所帮助:

        SELECT substring(CAST(date AS STRING), 1, 6) AS month, sum(revenue) AS total_rev
        FROM `revenue.table`
        GROUP BY month
        ORDER BY month DESC
        

        【讨论】:

        • 在提供我同意的您自己的解决方案方面付出了很多努力。如果您对提供上述解决方案所反映的更改提供原因或解释,那就太好了。
        • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 2012-10-26
        相关资源
        最近更新 更多