跳过和合并相似的数据 ecto elixir
skipping and merging similar data ecto elixir
我在数据库中有一些记录,我正在获取它们。
def get_all_records_for_sim(sim_number) do
SimLogs
|> where(number: ^sim_number)
|> order_by(asc: :datetime)
|> Repo.all
|> IO.inspect
end
结果,我得到了这样的数据,
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-12 10:39:00.839670], id: 795, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-12 11:02:20.296758], id: 815, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-13 05:30:25.800565], id: 837, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-16 05:24:04.536224], id: 859, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-16 12:28:21.565377], id: 881, name: "User 6 Sim",
number: "0860100421", volume_used: "43.09 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-17 05:03:49.866221], id: 903, name: "User 6 Sim",
number: "0860100421", volume_used: "43.09 MB"}]
它有很多重复项,不完全相同,但是如果您查看 DateTime
,日期的第一部分与 2017-10-12
和 [=17= 相同], 在上面的示例中,我正在处理该数据以进一步创建图表线
chartjs_data =
sim_number
|> get_all_records_for_sim()
|> Enum.map(fn(one_record) ->
{current_in_number, _} = one_record |> get_volume_used() |> String.replace(",", "") |> Float.parse()
{allowance_in_number, _} = one_record |> get_allowance() |> String.replace(",", "") |> Float.parse()
%{
datetime: "#{shift_datetime(one_record.datetime)}",
percentage_used: (current_in_number / allowance_in_number * 100) |> Float.round(3)
}
end)
这会导致这样的对象数组{percentage_used: 0, datetime: "2017-10-10 05:03:49"}
,我的问题是,我想合并相同的日期,例如,如果 2017-10-12
有 7 条记录,则将它们合并为一个,并且由于对象的另一半基于 volume_used
(ecto 结果查询),因此获取所有这 7 条记录的平均值 volume_used
并将其合并并创建对象为 {percentage_used: MEAN_OF_ALL_7_RECORDS, datetime: "2017-10-12"}
..
有多种方法可以做到这一点,但我正在寻找它是否可能在外,或者仅在服务器端以任何有效的方式?任何帮助将不胜感激。
更新:或者可能在 jquery 中处理这些数据,
[{percentage_used: 0, datetime: "2017-10-10 05:03:49"}
{percentage_used: 0, datetime: "2017-10-10 17:13:38"}
{percentage_used: 0, datetime: "2017-10-11 04:39:32"}
{percentage_used: 0, datetime: "2017-10-11 12:50:42"}
{percentage_used: 0, datetime: "2017-10-12 06:31:22"}
{percentage_used: 0, datetime: "2017-10-12 09:21:08"}
{percentage_used: 0, datetime: "2017-10-12 09:34:33"}
{percentage_used: 0, datetime: "2017-10-12 10:17:00"}
{percentage_used: 0, datetime: "2017-10-12 10:39:00"}
{percentage_used: 0, datetime: "2017-10-12 11:02:20"}]
并制作类似
的东西
[{percentage_used: 0, datetime: "2017-10-10"}
{percentage_used: 0, datetime: "2017-10-11"}
{percentage_used: 0, datetime: "2017-10-11"}]
任何解决方案都将是可观的。谢谢
您可以在查询中使用 DISTINCT ON date_trunc('day', datetime)
以 return 每天从数据库中获取一条记录:
SimLogs
|> where(number: ^sim_number)
|> distinct([s], fragment("date_trunc('day', ?)", s.datetime))
|> order_by(asc: :datetime)
|> Repo.all
要获取每天的最后一条记录,可以修改order_by
:
|> order_by([s], [asc: fragment("date_trunc('day', ?)", s.datetime), desc: s.datetime])
我在数据库中有一些记录,我正在获取它们。
def get_all_records_for_sim(sim_number) do
SimLogs
|> where(number: ^sim_number)
|> order_by(asc: :datetime)
|> Repo.all
|> IO.inspect
end
结果,我得到了这样的数据,
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-12 10:39:00.839670], id: 795, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-12 11:02:20.296758], id: 815, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-13 05:30:25.800565], id: 837, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-16 05:24:04.536224], id: 859, name: "User 6 Sim",
number: "0860100421", volume_used: "0.00 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-16 12:28:21.565377], id: 881, name: "User 6 Sim",
number: "0860100421", volume_used: "43.09 MB"},
%EdgeCommander.ThreeScraper.SimLogs{__meta__: #Ecto.Schema.Metadata<:loaded, "sim_logs">,
addon: "60GB Broadband", allowance: "61,440.00 MB",
datetime: ~N[2017-10-17 05:03:49.866221], id: 903, name: "User 6 Sim",
number: "0860100421", volume_used: "43.09 MB"}]
它有很多重复项,不完全相同,但是如果您查看 DateTime
,日期的第一部分与 2017-10-12
和 [=17= 相同], 在上面的示例中,我正在处理该数据以进一步创建图表线
chartjs_data =
sim_number
|> get_all_records_for_sim()
|> Enum.map(fn(one_record) ->
{current_in_number, _} = one_record |> get_volume_used() |> String.replace(",", "") |> Float.parse()
{allowance_in_number, _} = one_record |> get_allowance() |> String.replace(",", "") |> Float.parse()
%{
datetime: "#{shift_datetime(one_record.datetime)}",
percentage_used: (current_in_number / allowance_in_number * 100) |> Float.round(3)
}
end)
这会导致这样的对象数组{percentage_used: 0, datetime: "2017-10-10 05:03:49"}
,我的问题是,我想合并相同的日期,例如,如果 2017-10-12
有 7 条记录,则将它们合并为一个,并且由于对象的另一半基于 volume_used
(ecto 结果查询),因此获取所有这 7 条记录的平均值 volume_used
并将其合并并创建对象为 {percentage_used: MEAN_OF_ALL_7_RECORDS, datetime: "2017-10-12"}
..
有多种方法可以做到这一点,但我正在寻找它是否可能在外,或者仅在服务器端以任何有效的方式?任何帮助将不胜感激。
更新:或者可能在 jquery 中处理这些数据,
[{percentage_used: 0, datetime: "2017-10-10 05:03:49"}
{percentage_used: 0, datetime: "2017-10-10 17:13:38"}
{percentage_used: 0, datetime: "2017-10-11 04:39:32"}
{percentage_used: 0, datetime: "2017-10-11 12:50:42"}
{percentage_used: 0, datetime: "2017-10-12 06:31:22"}
{percentage_used: 0, datetime: "2017-10-12 09:21:08"}
{percentage_used: 0, datetime: "2017-10-12 09:34:33"}
{percentage_used: 0, datetime: "2017-10-12 10:17:00"}
{percentage_used: 0, datetime: "2017-10-12 10:39:00"}
{percentage_used: 0, datetime: "2017-10-12 11:02:20"}]
并制作类似
的东西[{percentage_used: 0, datetime: "2017-10-10"}
{percentage_used: 0, datetime: "2017-10-11"}
{percentage_used: 0, datetime: "2017-10-11"}]
任何解决方案都将是可观的。谢谢
您可以在查询中使用 DISTINCT ON date_trunc('day', datetime)
以 return 每天从数据库中获取一条记录:
SimLogs
|> where(number: ^sim_number)
|> distinct([s], fragment("date_trunc('day', ?)", s.datetime))
|> order_by(asc: :datetime)
|> Repo.all
要获取每天的最后一条记录,可以修改order_by
:
|> order_by([s], [asc: fragment("date_trunc('day', ?)", s.datetime), desc: s.datetime])