0
votes

Comment créer une séquence de dates?

Je veux compter le nombre d'actions par jour dans mon jeu de données. XXX PRE>

Il s'agit simplement d'un échantillon, mais le point est que mes données n'incluent pas les actions pour chaque jour et je Voulez-vous inclure des jours où il y a zéro actions dans mon résultat. P>

Mon plan est de le faire. P>

with dates as (
select [sequence of dates from 2010-01-01 to 2010-02-01] as day)

select day, coalesce(count(distinct action_id), 0) as actions
from dates
left join my_table
on dates.date = my_table.date


1 commentaires

Vous pouvez créer une table de date avec toutes les dates et y adhérer.


3 Réponses :


0
votes

Il semble que vous ayez besoin de groupe et comptez

 select date, count(distinct action_id) as action
 from my_table left join
 dates on dates.date = my_table.date
  group by date


0 commentaires

3
votes

vous exemple montre un CTE. Donc, vous pouvez utiliser un CTE récursif:

select d.day, count(distinct t.action_id) as actions
from (select date('2010-01-01') + interval (@rn := @rn + 1) - 1 day as day
  from my_table cross join
       (select @rn := 0) params
  limit 31
 ) d left join
     my_table t
     on d.day = my_table.date
group by d.day;


4 commentaires

Comment faire l'expression de table commune récursive? Il ne peut pas trouver l'objet dte


@ tadon11aaa. . . La solution plus simple est de réparer la faute de frappe - que je viens de le faire.


Est récursive une catégorie d'expressions de table communes?


@ tadon11aaa. . . Oui, c'est: dev.mysql. com / doc / Refman / 8.0 / FR / ... .



0
votes
with dates as
(
select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a
where a.Date between '<start_date>' and '<end_date>' )
select day, count(distinct action_id) as actions
from dates
left join my_table
on dates.date = my_table.date

0 commentaires