2017-08-05 20 views
-2

Regrouper les lignes par jour/semaine/mois à l'aide de la colonne inserted_at.
Exemple: Si la première ligne est créée avant 1 semaine, grouper par jours et si aucune donnée n'est créée au milieu, ajouter o comme valeur.Regrouper les lignes par jour/semaine/mois jusqu'à date dans Elixir

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

Merci d'avance.

Répondre

0

Il n'est pas tout à fait clair à partir de la question exactement ce qui est requis, mais j'espère que la requête suivante aide: Il vous donnera le nombre d'enregistrements regroupés par la partie date de 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 

Utilisation:

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

Merci pour la réponse. Il renvoie des résultats corrects, mais mon exigence est de savoir si les données entre les deux n'ont pas de données dans DB puis ajouter cette date et comptent comme 0. Comment faire pour y parvenir? – Ram

+0

Vous pouvez remplir toutes les valeurs manquantes avec 'Map.put_new' ou le faire en SQL en générant une série de dates et' left_join' à la requête ci-dessus, par exemple: https://stackoverflow.com/a/14113580/1650580 –

+0

Merci beaucoup – Ram