Ma table (Table1) J'ai fait une sorte de pivot et c'est bien: http://sqlfiddle.com/#!18/45b9d/1/0 p> maintenant je dois calculer La différence entre les mesures, pour obtenir quelque chose comme ceci: p> mais si je n'utilise pas d'agrégat, le résultat m'apporte des cellules null - http://sqlfiddle.com/#!18/45b9d/5/0 P> SELECT (SELECT DISTINCT a.Date)
, SUM(CASE WHEN a.Houses = 'House_A' THEN a.kW_measure END) as 'House_A'
, a.Kw_Measure - (SELECT MIN(b.kW_Measure) FROM Table1 b WHERE b.Houses = 'House_A'
AND b.Date < a.Date)
FROM Table1 a
GROUP BY Date, kW_Measure
ORDER BY Date ASC
3 Réponses :
Vous pouvez utiliser lag code>, voici le Démo a >.
| date | house_a | house_b | house_c |
| -----------| ------- | ------- | ------- |
| 2020-01-01 | 0 | 0 | 0 |
| 2020-01-02 | 20 | 25 | 10 |
| 2020-01-03 | 10 | 25 | 10 |
Fonctionne parfaitement, mais depuis que je devais utiliser à la fois house_n et quotidien, le code a plus grand pour moi.
Vous pouvez utiliser les fonctions de fenêtre. À partir de votre requête d'agrégation conditionnelle existante, cela calcule la différence de consommation entre la date actuelle et la date précédente pour chaque maison: la sous-requête n'est pas techniquement nécessaire, mais elle évite de répéter le conditionnel somme () code> s deux fois. p> p>
C'est la solution la plus propre, avec la sous-requête
Si vous souhaitez que la maison soit une colonne séparée comme suggère les résultats, vous pouvez simplement utiliser:
select house, date, kw_measure, (kw_measure - lag(kw_measure, 1, kw_measure) over (partition by house order by date) ) as diff from table1;
Aussi une bonne solution si je n'ai pas besoin d'utiliser chaque maison comme une colonne
Les tables dérivées ou les CTES sont un moyen d'obtenir des agrégats d'agrégats également.