【问题标题】:Group rows by day/week/month till date in Elixir在 Elixir 中按天/周/月对行进行分组
【发布时间】:2019-04-25 14:03:48
【问题描述】:

使用inserted_at 列按日/周/月对行进行分组。
示例:如果第一行是在 1 周之前创建的,则按天分组,如果在中间日期没有创建任何数据,则添加 o 作为值。

[
 {"21 Jul" => 12},{"22 Jul" => 0},{"23 Jul" => 3}, {"24 Jul" => 1}...
 {"5 Aug" => 0}
] 

提前致谢。

【问题讨论】:

    标签: datetime elixir phoenix-framework ecto


    【解决方案1】:

    假设您有一个包含名为 starts_at 的 DateTime 字段的事件架构。 例如,要按日期计算事件,您可以使用以下函数:

      def get_events_count_grouped_by_date(query) do
        query
        |> group_by([e], fragment("date(?)", e.starts_at))
        |> select([e], %{date: fragment("date(?)", e.starts_at), count: count(e.id)})
        |> order_by([e], asc: fragment("date(?)", e.starts_at))
      end
    

    然后像这样使用它:

    Event |> get_events_count_grouped_by_date() |> Repo.all()
    

    【讨论】:

      【解决方案2】:

      从问题中不清楚到底需要什么,但希望以下查询有所帮助:它将为您提供按inserted_at 的日期部分分组的记录数。

      defmodule CountByDateQuery do
        import Ecto.Query
      
        @doc "to_char function for formatting datetime as dd MON YYYY"
        defmacro to_char(field, format) do
          quote do 
            fragment("to_char(?, ?)", unquote(field), unquote(format))
          end
        end
      
        @doc "Builds a query with row counts per inserted_at date"
        def row_counts_by_date do
          from record in SomeTable,
          group_by: to_char(record.inserted_at, "dd Mon YYYY"),
          select: {to_char(record.inserted_at, "dd Mon YYYY"), count(record.id)}
        end
      
      end
      

      用法:

      row_counts_by_date() |> Repo.all() |> Map.new()
      %{"05 Aug 2017" => 2}
      

      【讨论】:

      • 感谢您的回答。它返回正确的结果,但我的要求是,如果中间的任何数据在 db 中没有数据,则添加该日期并计为 0。如何做到这一点?
      • 您可以使用Map.put_new 填充任何缺失值,或者在SQL 中通过为上面的查询生成一系列日期和left_join 来完成,例如:stackoverflow.com/a/14113580/1650580
      • 非常感谢
      猜你喜欢
      • 2020-09-21
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2021-10-30
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多