J'écris habituellement quelques questions très simples sur une base de données redshift utilisée dans un outil de visualisation marketing. Et je répète - très simple - je suis un novice à cela.
Je suis maintenant confronté à une nouvelle source de données (SQLite) et je suis bloqué.
J'ai une table avec:
order_id
order_date
où il y a plusieurs commandes par jour. Et j'essaie d'obtenir un total de l'exécution du nombre quotidien des identifiants de commande.
Par exemple, la table contiendrait:
order_id order_date
2541 2017-06-05
26777 2017-06-05
123 2017-06-06
8795 2017-06-07
Et j'essaie d'arriver à ce résultat:
Day RunningTotal
2017-06-05 : 2
2017-06-06 : 3 (the 2 of the previous day + 1 this day)
2017-06-07 : 4
Dans PostgreSQL, j'utiliserais
SELECT
order_date,
SUM (COUNT(order_id)) OVER (ORDER BY order_date rows between unbounded preceding and current row) as RunningTotal
FROM table
ORDER BY
order_date
GROUP BY
order_date
Comment puis-je faire cela dans SQLite?
J'ai chooglé - et voir de nombreux exemples de somme ou de comptage mais rarement combinés et de ne jamais atteindre un total du nombre de comptes.
Pour quiconque essayait quelque chose de similaire: c'est ce qui a fonctionné à la fin:
select
a.ORDER_DATE,
sum(b.ID_COUNT) RunningTotal
from
(select
ORDER_DATE, Count(DISTINCT(SOFTWARE_ID)) ID_COUNT
from orders
group by ORDER_DATE
order by ORDER_DATE) a,
(select
ORDER_DATE, Count(DISTINCT(SOFTWARE_ID)) ID_COUNT
from orders
group by ORDER_DATE
order by ORDER_DATE) b
where a.ORDER_DATE >= b.ORDER_DATE
group by a.ORDER_DATE
order by a.ORDER_DATE;
Peut-être que cela aidera: créer une vue qui offre le nombre () pour chaque jour, puis utilisez cette vue (dans une requête) pour calculer le total exécuté (avec somme ()):
create view order_view
as
select
order_date
, count(order_id) order_count
from orders
group by order_date
order by order_date ;
Ceci fournit (en utilisant vos données de test):
select * from order_view
-- output
order_date order_count
2017-06-05 2
2017-06-06 1
2017-06-07 1
Ensuite, utilisez quelque chose comme ...
select
a.order_date
, sum(b.order_count) RunningTotal
from
order_view a
, order_view b
where a.order_date >= b.order_date
group by a.order_date
order by a.order_date;
-- output
order_date RunningTotal
2017-06-05 2
2017-06-06 3
2017-06-07 4
Voir aussi: dbfiddle . Notez que "SQLite n'a pas de classe de stockage mis de côté pour stocker des dates et/ou des heures." (Voir https://sqlite.org/dataType3.html )