gpt4 book ai didi

ruby-on-rails - 从原始 sql 查询返回哈希

转载 作者:行者123 更新时间:2023-12-04 02:35:16 24 4
gpt4 key购买 nike

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

为简单起见,我在表 1 中有以下记录:

<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。非常感谢任何类型的帮助。对不起,如果这是一个菜鸟问题。

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

最佳答案

您可以通过多种方式在 Rails 中执行原始查询(使用 ActiveRecord):

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}

关于ruby-on-rails - 从原始 sql 查询返回哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62240933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com