-1
votes

Convertir une colonne en deux colonnes en fonction de la condition

J'ai une table ressemblant à ceci: xxx

Je veux convertir cette table en cette base sur valeur (valeur = 1 ==> Starttime, valeur = 0 ==> . xxx

J'ai essayé d'utiliser un cas lors de la sélection de l'instruction SELECT, mais renvoyez NULL sur chaque colonne comme celle-ci xxx


5 commentaires

Cela ne convient pas à une colonne en deux, il s'agit d'un problème d'espace-et d'îles - vous essayez de trouver les valeurs de début / de fin de l'île spécifiées par . Les lacunes et les îles est le nom réel de cette catégorie de problèmes. Vous pouvez utiliser Google pour trouver des solutions. Dans ce cas, somme (valeur) sur (partition par TAGName Commande par DateTime) vous donnera un île que vous pouvez utiliser pour le regroupement et l'extraction du min (datetime) et < Code> Max (DateTime) Valeur. Somme sur renvoie un total exécuté de la valeur . Compte tenu de la valeur ... Les valeurs qui finissent par devenir une incrémentation Island ID


Vous ne pouvez pas regrouper une colonne calculée cependant, de sorte que tout cela devrait être enveloppé dans un CTE, par exemple avec des îles comme (SELECT ... SUM () ... AS ILLIMEID ..) Sélectionnez TagName, Min ( DateTimeOffset), max (DateTime) du groupe Îles par TagName, Islandid


Avec la commande toujours 1 -> 0 -> 1 -> 0 -> ...? Pourriez-vous avoir 1 -> 0 -> 0 -> 1? Que se passe-t-il alors?


Voici un bon endroit à lire sur les lacunes et les îles < / a>


@Panagiotiskanavos merci beaucoup pour votre aide !!! J'ai la recherche sur les lacunes et les îles et être capable de résoudre mon problème !!!


3 Réponses :


1
votes

Depuis que vous n'avez pas de colonne de regroupement ici, nous devons faire une hypothèse: nous pouvons traiter vos données en supposant que si nous commandons à la date, les 1 et 0 alternaient. Sinon, il n'y a pas de solution, car nous ne savons pas comment corréler les 1 avec les 0 avec les 0.

Étant donné que nous pouvons assumer cette commande, nous pouvons utiliser lag () code> ou . () code> pour faire cela. Notez que cela suppose que vous commenciez avec 1, et chaque 1 a un correspondant 0. Si le dernier 1 n'a pas de 0 correspondant 0, puis de fin de temps sera null pour cette ligne. P>

select  u.TagName, 
        u.StartTime, 
        u.EndTime 
from    (
        select  TagName, 
                StartTime = [DateTime] ,
                EndTime   = lead([DateTime], 1) over
                            (
                                partition by TagName
                                order by [Datetime] asc
                            ), 
                value 
        from t
        ) u
where   u.value = 1


2 commentaires

Vous devez partitionner par tagname .


Vrai, je ne devrais pas supposer un seul tagname.



0
votes

Il existe de multiples façons de l'approcher. Si je suppose que les valeurs sont parfaitement entrelacées, une méthode est une agrégation: xxx


0 commentaires

0
votes

Juste parce que je n'ai pas vu le Somme () sur Code> Option

Exemple fort> p>

TagName     StartTime                   EndTime
HA_06_ON    2020-07-07 08:52:14.000     2020-07-07 09:01:42.000
HA_06_ON    2020-07-07 09:02:17.000     2020-07-07 09:32:55.000
HA_06_ON    2020-07-07 09:33:21.000     2020-07-07 09:35:02.000
HA_06_ON    2020-07-07 09:35:27.000     2020-07-07 09:35:44.000
HA_06_ON    2020-07-07 10:10:32.000     2020-07-07 10:10:40.000


0 commentaires