web-dev-qa-db-fra.com

Total exécuté d'un compte par jour en SQLite

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.

2
user132928

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;
2
user132928

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 )

1
stefan