Je veux compter le nombre d'actions par jour dans mon jeu de données. 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
3 Réponses :
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
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;
Comment faire l'expression de table commune récursive? Il ne peut pas trouver l'objet dte code>
@ 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 / ... .
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
Vous pouvez créer une table de date avec toutes les dates et y adhérer.