j'ai une table appelée PROD_COST
avec 5 champs:valeurs négatives et positives alternatives
(ID, Duration, Cost, COST_NEXT, COST_CHANGE)
J'ai besoin champ supplémentaire appelé Groups
pour l'agrégation.
- Durée = nombre de jours où le prix est valide (1 jour = 1 heure).
- Coût = prix du produit en ce jour.
- -Cost_next = lead (coût, 1,0).
- Cost_change = Cost_next - Coût.
.
+ ID + Duration + Cost + Next_Cost + Cost_change + Groups+
| 1 | 1 | 10 | 8.5 | -1.5 | 1 |
| 2 | 1 | 8.5 | 12.2 | 3.7 | 2 |
| 3 | 1 | 12.2 | 5.3 | -6.9 | 3 |
| 4 | 1 | 5.3 | 4.2 | 1.2 | 4 |
| 5 | 1 | 4.2 | 6.2 | 2 | 4 |
| 6 | 1 | 6.2 | 9.2 | 3 | 4 |
| 7 | 1 | 9.2 | 7.5 | -2.7 | 5 |
| 8 | 1 | 7.5 | 6.2 | -1.3 | 5 |
| 9 | 1 | 6.2 | 6.3 | 0.1 | 6 |
| 10 | 1 | 6.3 | 7.2 | 0.9 | 6 |
| 11 | 1 | 7.2 | 7.5 | 0.3 | 6 |
| 12 | 1 | 7.5 | 0 | 7.5 | 6 |
+----+----------+------+-----------+-------------+-------+
J'ai besoin de champ de groupe Groups
par Cost_change
. Cela peut être positif, négatif ou nul.
Certains gars aimables m'a conseillé d'utiliser ce code:
Select
id
, COST_CHANGE
, sum(Groups) over (order by id asc) +1
from
(
select
pc.*,
(case when sign(cost_change) - sign(lag(cost_change) over (order by id)) between -1 and 1
then 0
else 1 -- `NULL` intentionally goes here
end) Groups
from Prod_Cost
) pc
Mais il y a un problème: s'il y a 0 valeurs entre deux valeurs positives/négatives ou négatives/positives puis il regroupe ensemble, par exemple :
Cost_change Groups
| -5.279 | 33 |
| 5.279 | 34 |
| 0.000 | 34 |
| -5.279 | 34 |
| 0.000 | 34 |
| 5.279 | 34 |
| -8.769 | 35 |
je dois avoir:
Cost_change Groups
| -5.279 | 33 |
| 5.279 | 34 |
| 0.000 | 34 |
| -5.279 | 35 |
| 0.000 | 35 |
| 5.279 | 36 |
| -8.769 | 37 |
Deuxième exemple:
Cost_change Groups
| 7.574 | 68 |
| 0.000 | 68 |
| -5.279 | 68 |
| -3.490 | 68 |
Mais j'ai besoin:
Cost_change Groups
| 7.574 | 68 |
| 0.000 | 68 |
| -5.279 | 69 |
| -3.490 | 69 |
Je serais très reconnaissant pour toute aide.
Pouvez-vous avoir plusieurs zéros consécutifs (plus d'un)? La première rangée peut-elle avoir zéro? Quel résultat final devrait être dans ces cas? –
Vous devez fournir des zéros dans vos données d'échantillon pour clarifier ce que vous voulez vraiment faire. Que se passe-t-il lorsque plusieurs zéros sont dans une rangée? Que se passe-t-il lorsque les signes sont les mêmes de chaque côté? –
@GordonLinoff, salut Gordon, Voici un fragment de mes données http://s000.tinyupload.com/index.php?file_id=59699169718899539984 (votre requête). Mais j'ai besoin http://s000.tinyupload.com/?file_id=99257550972254124566 Vous me comprenez correctement à propos de 0 valeurs, ils doivent être inclus à +/- valeurs, Quand mes données comme -8,2; 0; 0; -8.2, alors votre requête le groupe comme: 1; 1 ; 1 ; 1 et c'est correct parce que la séquence est: moins; 0; 0; "Mais quand mes données: -8,2; 0; 0; +7,2, alors il doit être 1; 1; 1; 2 parce que la phrase est:" moins; 0; 0; plus "Je ne suis pas très bon en Egnlish, mais j'espère vous me comprenez – RussianBear7