gpt4 book ai didi

ruby-on-rails - 使用 DATE_TRUNC ('week' ),如果一周的 .sum( :points) has 0?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:50 24 4
gpt4 key购买 nike

我有以下 Rails+Postgres 查询来查询数据库中的点总数并按周分组:

Log Table: id, user_id, points, created_at

points_by_week = Log.where(user_id: user_id).group("DATE_TRUNC('year', created_at)", "DATE_TRUNC('week', created_at)").sum(:points)

返回结果如下:

{ [2017-01-01 00:00:00 UTC, 2017-04-17 00:00:00 UTC]=>10, 
[2017-01-01 00:00:00 UTC, 2017-05-15 00:00:00 UTC]=>110,
[2017-01-01 00:00:00 UTC, 2017-06-19 00:00:00 UTC]=>1185 }

问题是如果每周存在 1 个或多个点,这只会返回一条记录。

我怎样才能:

  1. 如果一周包含 0 分,则返回一周结果。例如,对于上面的返回,缺少 2017-05-08 的那一周,因为它有 0 分。我想让它回到上面。因此,当我绘制此结果时,周显示为 0。
  2. 指定要返回多少周?并确保如果一周包含 0 分,则按照上面的 #1 输出。

谢谢

最佳答案

我不同意这足够复杂以保证使用 SQL 或 Arel。您已获得所需结果的 95%,其余的应该是微不足道的。

方法一

如果您只想从哈希中获取值,请考虑像这样在哈希上定义一个默认值:

points_by_week =
Hash.
new(0).
merge(
Log.
where(user_id: user_id).
group("DATE_TRUNC('year', created_at)", "DATE_TRUNC('week', created_at)").
sum(:points)
)

然后,无论何时调用:

points_by_week[x]

...如果 x 不在哈希中,您将返回 0。

如果不存在的键需要 nil,那么您可以将 nil 而不是 0 传递给 Hash.new

方法二

或者,如果您真的需要在散列中填充整个值集,您可以创建一个散列,其中包含所需的键和零/零值,基于范围(我使用过此处为 0 到 100 的整数):

Hash[*(0..5).to_a.zip(Array.new(6,0)).flatten]
=> {0=>0, 1=>0, 2=>0, 3=>0, 4=>0, 5=>0}

……或者……

Hash[*(0..5).to_a.zip(Array.new(6)).flatten]
=> {0=>nil, 1=>nil, 2=>nil, 3=>nil, 4=>nil, 5=>nil}

(也许有更方便的方法),#reverse_merge 它与您当前的哈希。

例如

2.2.5 :036 > x = {1 => 1, 3 => 3}
=> {1=>1, 3=>3}
2.2.5 :037 > y = Hash[*(0..5).to_a.zip(Array.new(6,0)).flatten]
=> {0=>0, 1=>0, 2=>0, 3=>0, 4=>0, 5=>0}
2.2.5 :038 > z = x.reverse_merge(y)
=> {0=>0, 1=>1, 2=>0, 3=>3, 4=>0, 5=>0}

可以使用类似以下内容生成星期一日期数组:

mondays = (Date.parse("2017-04-17")..(Date.parse("2017-04-17")+20.weeks)).map(&:to_time).select(&:monday?)

... 并转换为 [year,date] 对...

year_monday_pairs = mondays.map{|d| [d.beginning_of_year, d] }

... 并转换为 #reverse_merge 所需的散列 ...

Hash[*year_monday_pairs.zip(Array.new(year_monday_pairs.size, 0)).flatten(1)]
=> {[2017-01-01 00:00:00 +0000, 2017-04-17 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-04-24 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-05-01 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-05-08 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-05-15 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-05-22 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-05-29 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-06-05 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-06-12 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-06-19 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-06-26 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-07-03 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-07-10 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-07-17 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-07-24 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-07-31 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-08-07 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-08-14 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-08-21 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-08-28 00:00:00 +0100]=>0, [2017-01-01 00:00:00 +0000, 2017-09-04 00:00:00 +0100]=>0}

关于ruby-on-rails - 使用 DATE_TRUNC ('week' ),如果一周的 .sum( :points) has 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44666310/

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