MySQL interroge les données dans une période de temps et traite les données de la même date ou du même type

Données de requête MySQL dans la période

La table est montrée dans la figure, le nom de la table est démo et la table est une table de mise à jour en temps réel d'un certain inventaire

 

 

Les données principales sont : les données temporelles, les données d'inventaire de quantité

Les données de requête MySQL dans la période peuvent utiliser la méthode between

select  amount
from demo
where time 
between "2021-01-01 00:00:00" and "2022-01-01 00:00:00"

Il convient de noter que si les données sur le côté droit de entre sont les mêmes, elles ne seront pas comptées, c'est-à-dire des parenthèses ouvertes

Si les données requises ne sont précises qu'au jour près et que les paramètres n'ont pas d'heure, de minute et de seconde, les données à la fin de la période seront perdues, c'est-à-dire que les données du 1er janvier ne seront pas comptées.

Vous pouvez utiliser le calendrier de Java pour étendre la portée

Calendar gc = Calendar.getInstance();
Date a=productionParam.getEndtime();
gc.setTime(a);
gc.add(Calendar.DAY_OF_MONTH, 1 );
gc.add(Calendar.SECOND,-1);

Ajoutez un jour aux données de fin et soustrayez 1 seconde, qui est "2022-01-01 23:59:59", et les données du 1er janvier peuvent être comptées

Traiter les données à la même date

On peut voir que la date (précise au jour près) des troisième et quatrième éléments est la même

Le traitement peut être divisé en deux cas, en ajoutant ou en choisissant l'un d'eux

L'ajout peut être fait en utilisant la fonction sum() de sql et group by 

Il convient de noter que, comme l'heure, les minutes et les secondes des deux données sont différentes, le groupe par ne peut pas être directement groupé. Vous pouvez utiliser DATE_FORMAT de mysql pour les formater, puis les grouper. Étant donné que le formatage et le groupement ne peuvent pas être effectués en même temps , une deuxième requête est requise.

select
time,sum(amount)
from(
    select
    DATE_FORMAT(time, '%Y-%m-%d' ) AS time,
    amount
    from demo) as a
group by
a.time

Choisissez une des mêmes dates

En supposant que les données de la même date n'ont besoin que de la dernière donnée, vous pouvez utiliser la méthode MAX () de mysql

De même, la date doit également être formatée et regroupée, mais la quantité de données après le regroupement n'est pas contrôlable, et le plus important est que la date ne puisse pas être distinguée après le formatage. c'est-à-dire que la précision est perdue

Par conséquent, le champ id doit être utilisé . La date par défaut est insérée dans l'ordre, c'est-à-dire que l'id est également organisé dans l'ordre. À ce stade, la jointure gauche jointure droite peut être utilisée pour répondre à cette exigence.

select
id,
time,
amount
from demo
RIGHT JOIN (
     select
        MAX(id) as id
    from(
        select
        id,
        DATE_FORMAT(time, '%Y-%m-%d' ) AS time,
        amount
        from demo) as a
    group by
    a.time ) as b
on id=b.id

Et puis, en production

Modifications de la demande, besoin de refléter la somme de l'inventaire de chaque jour dans la période, pour les statistiques ou les graphiques linéaires

Il doit être reclassé selon le type de données, et il est nécessaire d'interroger la somme de tous les types d'inventaire chaque jour.

Le plus important est d'avoir une division de période de temps, mais les données en dehors de la période de temps doivent encore être considérées (la somme de tous les types d'inventaire), et une valeur initiale de l'inventaire avant le début de la période de temps (la point de départ du graphique linéaire) est requis.

peut être compris comme

Pour interroger l'inventaire sur une certaine période, à savoir le montant, vous devez interroger l'inventaire total de chaque jour de la période. L'inventaire total de la journée est la somme de l'inventaire de tous les types (types) ce jour-là, et chaque donnée de la base de données est une donnée mise à jour en temps réel sur les niveaux d'inventaire par catégorie.

Lors de l'interrogation, les dernières données sont sélectionnées lorsque le même type de données apparaît le même jour, et lorsque la quantité totale d'inventaire interrogée n'est pas au début de la période, la valeur initiale doit être interrogée, c'est-à-dire la quantité totale de stock avant la période, c'est-à-dire quand Lorsque le stock de n'importe quel type n'est pas au début de la période, la valeur initiale avant la période doit être interrogée et utilisée pour le calcul ultérieur du stock total

À ce stade, la requête de base de données seule ne peut pas répondre à la demande.

Ma solution de contournement est

Interrogez tous les numéros de type des données de production, placez la valeur initiale du type avant la période de temps de requête une par une et placez-la dans le tableau, puis regroupez par deux champs (heure et type) pour obtenir différents types de réel- heure changeant les données, à l'exclusion du même type dans le même Les données du jour changent, et enfin selon la date, le type et l'inventaire interrogés, la valeur d'inventaire dans le tableau est continuellement remplacée et calculée.

Ce problème peut-il être résolu en utilisant uniquement sql?

Je suppose que tu aimes

Origine blog.csdn.net/xsj5211314/article/details/123164462
conseillé
Classement