【问题标题】:Return hash from raw sql query从原始 sql 查询返回哈希
【发布时间】:2020-06-15 02:50:09
【问题描述】:

我正在构建一个 ruby​​ on rails 应用程序,它使用原始 SQL 来查询我的数据库,因为我听说它比使用 ActiveRecord 执行得更好,而且我将处理数百万条记录。

为了简单起见,我在 Table1 中有以下记录:

<id: 1, price: 20, quantity: 2, date: "2020-01-01T10:02:32"> 
<id: 2, price: 5, quantity: 1, date: "2020-01-01T10:32:12">
<id: 3, price: 10, quantity: 3, date: "2020-01-01T12:01:10">

我想要做的是每小时获得price * quantity 的总数作为哈希值或任何有意义的值。所以在这种情况下,结果将如下所示:

{“2020-01-01 10:00:00”: 45, “2020-01-01 12:00:00”: 30}

如您所见,2020-01-01 10:00:00 的值是 45,我们得到这个表单是在执行 (20*2)+(5*1),因为这些记录的日期都在同一小时内。

现在,最初,我在 ruby​​ 中有一个简单的循环,它遍历该表并返回所需的结果,但后来我了解到原始 sql 在处理更大的数据时性能要好得多。我想知道如何使用原始 sql 获得这个结果。我正在使用postgresql。非常感谢任何类型的帮助。对不起,如果这是一个菜鸟问题。

编辑 我将时间戳更改为字符串类型,因为这就是我获取数据的方式。

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    在 Rails(使用 ActiveRecord)中执行 raw 查询有多种方式:

    query = <<-SQL
      SELECT TO_CHAR(date::timestamptz, 'YYYY-MM-DD HH') AS formatted_date,
             SUM(price * quantity) AS total
      FROM table1s
      GROUP BY TO_CHAR(date::timestamptz, 'YYYY-MM-DD HH')
    SQL
    
    Table1.find_by_sql(query).to_h { |table| [table.formatted_date, table.total] }
    # {"2020-01-01 12"=>30, "2020-01-01 10"=>45}
    
    ActiveRecord::Base.connection.execute(query).values.to_h
    # {"2020-01-01 12"=>30, "2020-01-01 10"=>45}
    
    ActiveRecord::Base.connection.exec_query(query).rows.to_h
    # {"2020-01-01 12"=>30, "2020-01-01 10"=>45}
    

    你可以试一试,看看他们的表现如何。但是,我必须提到 ActiveRecord 版本更短、更清晰且易于获取:

    Table1.group("TO_CHAR(date::timestamptz, 'YYYY-MM-DD HH')").sum('price*quantity')
    # SELECT SUM(price*quantity) AS sum_priceallquantity, TO_CHAR(date, 'YYYY-MM-DD HH') AS to_char_date_yyyy_mm_dd_hh FROM "table1s" GROUP BY TO_CHAR(date, 'YYYY-MM-DD HH')
    # {"2020-01-01 12"=>30, "2020-01-01 10"=>45}
    

    【讨论】:

    • 如果日期值实际上是字符串怎么办?我忘了提到日期是以字符串格式存储的。查看修改。
    • 那我觉得你可以先把字符串日期转换成时间戳来保存小时,然后再提取你需要的。查看更新的答案@jim。
    【解决方案2】:

    如果是时间戳

    group by to_char(timestamp_field, 'YYYY-MM-DD HH') 
    

    然后在选择中

    sum(price*quantity)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多