11
votes

Alternate de la fonction de décalage en plomb dans SQL Server 2008

Je veux comparer la ligne actuelle avec une valeur dans la ligne suivante. SQL a LEAD et Lag pour obtenir les valeurs suivantes et précédentes, mais je ne peux pas les utiliser car j'utilise SQL Server 2008.

Alors comment puis-je obtenir ce ?

J'ai une table avec la sortie xxx

Ce que je veux faire, c'est si l'état de la ligne actuelle est 1 et l'état de la ligne suivante est 6 et les deux Les temps sont les mêmes (jusqu'à minutes), alors je veux obtenir la ligne où le statut est 1.

Donc, je veux obtenir cette ligne ou cette carte d'identité pour le statut 1 IE. ID 6


0 commentaires

3 Réponses :


12
votes

Dans votre cas, le ID s semble être numérique, vous pouvez simplement faire une jointure auto-jointure: xxx

Ce n'est pas tout à fait la même minute . C'est dans les 60 secondes. Avez-vous besoin de la même minute de temps calendaire? Si tel est le cas, vous pouvez faire: xxx


5 commentaires

Peut-être que la solution ci-dessus n'assume aucun trous dans la colonne ID.


Merci pour votre heure et votre solution parfaite ... Je comparais temps comme convertir (Char (16), T1.MinstarTime, 120) .. Donc, il reviendra du temps jusqu'à la cinquième minutes ... est cette mauvaise approche?


@Spenzo. . . Non, c'est une approche fine. Mais qui peut se souvenir de tous les formats pour convert () , alors j'ai tendance à trouver d'autres solutions (telles que celle de la réponse).


Suivi avec une jointure multi-table plus complexe basée sur une excellente réponse de Gordon.


Merci @gordonlinoff. Tu es toujours une superstar :)



0
votes

Il suffit de poster une jointure plus complexe en utilisant deux tables différentes créées avec la fondation de Gordon. Excusez les noms d'objet spécifiques, mais vous obtiendrez le gist. Obtient le pourcentage de changement d'échantillons d'un à l'autre.

SELECT 
      fm0.SAMPLE curFMSample
    , fm1.SAMPLE nextFMSample
    , fm0.TEMPERATURE curFMTemp
    , fm1.TEMPERATURE nextFMTemp
    , ABS(CAST((fm0.Temperature - fm1.Temperature) AS DECIMAL(4, 0)) / CAST(fm0.TEMPERATURE AS DECIMAL(4, 0))) AS fmTempChange
    , fm0.GAUGE curFMGauge
    , fm1.GAUGE nextFMGauge
    , ABS(CAST((fm0.GAUGE - fm1.GAUGE) AS DECIMAL(4, 4)) / CAST(fm0.GAUGE AS DECIMAL(4, 4))) AS fmGaugeChange
    , fm0.WIDTH curFMWidth
    , fm1.WIDTH nextFMWidth
    , ABS(CAST((fm0.Width - fm1.Width) AS DECIMAL(4, 2)) / CAST(fm0.Width AS DECIMAL(4, 2))) AS fmWidthChange
    , cl0.TEMPERATURE curClrTemp
    , cl1.TEMPERATURE nextClrTemp
    , ABS(CAST((cl0.Temperature - cl1.Temperature) AS DECIMAL(4, 0)) / CAST(cl0.TEMPERATURE AS DECIMAL(4, 0))) AS clrTempChange
FROM 
    dbo.COIL_FINISHING_MILL_EXIT_STR02 fm0
    INNER JOIN dbo.COIL_FINISHING_MILL_EXIT_STR02 fm1 ON (fm0.SAMPLE = fm1.SAMPLE - 1 AND fm1.coil = fm0.coil)
    INNER JOIN dbo.COIL_COILER_STR02 cl0 ON fm0.coil = cl0.coil AND fm0.SAMPLE = cl0.SAMPLE
    INNER JOIN dbo.COIL_COILER_STR02 cl1 ON (cl0.SAMPLE = cl1.SAMPLE - 1 AND cl1.coil = cl0.coil)
WHERE
    fm0.coil = 2015515872


0 commentaires

0
votes

Eh bien, je suggérerais une solution très simple si vous n'avez pas d'identifiant de ligne séquentielle, mais une étape différente (si certains enregistrements ont été supprimés par exemple ..): xxx

exemple de source Table @T: xxx

Sélectionnez avec auto jointure xxx

résultat: xxx


0 commentaires