0
votes

Le calcul de la consommation est de retourner zéro

J'ai créé une requête pour calculer la consommation (Delta) des valeurs dans une table.

J'ai testé cela sur de nombreux ensembles de données et la valeur renvoyée est toujours nulle.

Voici un violon dB avec le jeu de données et la requête: dB Fiddle

La première ligne de l'ensemble de données est le point de départ et sera zéro. La deuxième ligne du tableau des résultats devrait être de 0,2, etc.

Je ne peux pas savoir pourquoi zéro revenir, je le fais clairement cela tout à fait faux.

The attendu La sortie ressemblerait à: xxx

Un point important est d'où une ligne est nulle, la valeur sera nulle. Mais la consommation de la ligne suivante sera moins la valeur avant le zéro. Ceci est représenté dans la rangée 8 et 9.

TIA


5 commentaires

Pouvez-vous expliquer votre logique. Votre expression pour ComptoirConspation est max (moulage (canalvalue en tant que numérique (10,2))) - min (canalvalue) , cependant, canalvalue est int . Un int moins A int ne peut pas évaluer à un décimal , donc la valeur 0.2 serait impossible pour cette expression. Les résultats attendus et une description d'eux aideraient grandement ici.


Vous avez oublié d'inclure l'explication.


Le violon ajouté ceux-ci. J'ai changé le violon pour représenter la manière dont la table est réellement. Parfois, la valeur du canal peut être du texte (pour d'autres canaux, pas celui utilisé dans ce cas). Je les filtre dans une autre requête.


Encore une fois, encore une fois, canalvalue est un int . Il ne peut pas stocker les valeurs décimales. La valeur 8924.2 sera stockée sous forme 8924 .


@Larnu L'idée est que je passe à travers les données deux rangées à la fois, en prenant un de l'autre. En termes de chose INT, j'ai supprimé cela du violon, car le violon crée le type de données.


3 Réponses :


0
votes

Vous regroupez (entre autres colonnes) sur lisantDate . Cela signifie que chaque groupe sera composé d'une rangée. Dans ce groupe, max (canalvalue) sera le même que min (canalvalue) . Soustraire deux valeurs égales entraîne zéro.


0 commentaires

1
votes

Si vous modifiez votre type de données de canalvalue vers un décimal (peut-être un décimal (10,2) ) Cela vous donne la majeure partie de la Résultats Vous après: XXX

Il va "mal" lorsque canalvalue va à 0 , mais nous manquons la logique derrière vos besoins. Espérons que cela vous obtient la distance

EDIT: Cette hypothèse semble le faire: xxx

DB <> violon


5 commentaires

Où une ligne est nulle, la valeur doit rester à zéro. Mais la consommation de la ligne suivante sera moins la valeur avant le zéro. Ceci est montré dans la rangée 8 et 9.


@Theorangegoblin ce que je deviné. Pourquoi les explications sont importantes.


Ajout d'un dB <> violon pour vous aussi @theorangegoblin qui semble obtenir les résultats corrects.


Je luttons toujours avec l'affaire SQL et oubliez que le plomb et le retard. Merci.


Vous êtes le bienvenu @theorangegoblin. Si cela fonctionne, veuillez le marquer comme solution afin que les futurs lecteurs sachent que la réponse vous a aidée. Merci.



0
votes

Vos exigences dans la question sont un peu floues, mais les échantillons de données et commentaires les clarifient.

Fondamentalement, vous avez besoin de Lag () , mais vous souhaitez également ignorer 0 valeurs. Il n'y a pas de moyen trivial d'accomplir cela dans SQL Server. La norme a ignorer null s, mais qui n'est pas implémentée.

Une méthode serait un max cumulatif. Cependant, cela nécessiterait que les données augmentent toujours. Bien que cela puisse être le cas, cela n'est pas explicitement mentionné.

Tout ce qui dit, le suivant renvoie vos résultats spécifiés: xxx

ICI est un dB <> FIDDLE.

Certaines notes supplémentaires:

  • Il n'y a aucune raison de convertir une colonne DateTime sur un DateTime .
  • J'ai changé valeur de sorte qu'il s'agit d'une chaîne numérique plutôt qu'une chaîne. Stocker des données à l'aide des types appropriés.
  • Je recommande de stocker des données manquantes comme null plutôt que 0 .

0 commentaires