2009-05-05 6 views
0

J'utilise MS SQL 2005 et j'ai créé une requête CTE pour renvoyer des valeurs des deux derniers enregistrements. Je l'utilise ensuite pour trouver le delta de deux chiffres retournés. J'ai une question de travail de toutes sortes mais J'ai des problèmes pour obtenir autre chose que le chiffre delta.Aide pour trouver la différence (delta) à partir d'une valeur renvoyée par les deux derniers enregistrements

voici ma question:

;with data as(
    SELECT 
     NetObjectID, 
     RawStatus, 
     RowID, 
     rn 
    from( 
     SELECT 
      CustomPollerAssignmentID AS NetObjectID, 
      RawStatus, 
      RowID, 
      row_number() over(order by DateTime desc)as rn 
     FROM CustomPollerStatistics_Detail 
     WHERE 
      (CustomPollerAssignmentID='a87f531d-4842-4bb3-9d68-7fd118004356') 
    ) x where rn<=2 
) 
SELECT 
    case when 
     max(case rn when 1 then RawStatus end) > max(case rn when 2 then RawStatus end) 
    then 
     max(case rn when 1 then RawStatus end) - max(case rn when 2 then RawStatus end) 
    else 
     max(case rn when 2 then RawStatus end) - max(case rn when 1 then RawStatus end) 
    end as Delta 
from data having 
(SELECT 
    case when 
     max(case rn when 1 then RawStatus end) > max(case rn when 2 then RawStatus end) 
    then 
     max(case rn when 1 then RawStatus end) - max(case rn when 2 then RawStatus end) 
    else 
     max(case rn when 2 then RawStatus end) - max(case rn when 1 then RawStatus end) 
    end 
from data) >= 1 

Ce que je suis après est d'obtenir le Delta & NetObjectID retourné. Chaque fois que j'essaie, j'ai des erreurs. Si j'essaie d'ajouter un groupe par etc .. à la fin de la requête, je reçois plus d'erreur se plaindre du mot «groupe». Je suis relativement nouveau à SQL et je prends des choses comme je vais. Toute aide serait reçue avec gratitude.

Répondre

0

voir si quelque chose comme ça va fonctionner.

;with data as 
( 
    SELECT   
     NetObjectID,   
     RawStatus,   
     RowID,   
     rn  
    from 
    (    
     SELECT     
      CustomPollerAssignmentID AS NetObjectID,     
      RawStatus,     
      RowID,     
      row_number() over(order by DateTime desc)as rn   
     FROM CustomPollerStatistics_Detail   
     WHERE     
     (
      CustomPollerAssignmentID='a87f531d-4842-4bb3-9d68-7fd118004356' 
     )  
    ) x 
    where rn<=2 
) 
select 
    NetObjectID, 
    max(RawStatus)-min(RawStatus) as Delta 
from data 
group by NetObjectID 
+0

Je ne pensais pas utiliser max() et min() de cette façon. Nice .... Oui, cela retourne ce dont j'ai besoin, même si je voudrais inclure la clause "ayant x> y". Des idées?? – MarkKneen

+0

Que voulez-vous que la clause having fasse? – DForck42

+0

Je ne sais pas si vous connaissez ou avez entendu parler d'une application appelée Solarwinds - Network Performance Monitor. Avec cette application, je peux concevoir des alertes basées sur un certain déclencheur. Ce SQL est l'un de ces déclencheurs. Fondamentalement, quand le Delta est supérieur à 48, je veux un résultat mais quand c'est moins de 48, je ne veux rien. Presque une réponse de type vrai/faux. – MarkKneen

0

Désolé, je suis très nouveau ici et je ne suis pas sûr de requêtes CTE, mais il semble que, après avoir défini les données, vous sélectionnez case ... comme Delta FROM .... ce qui signifie que vous avez seulement Delta votre déclaration select. Encore une fois, désolé si je suis loin de la base.

+0

Merci pour votre réponse, Dans la sélection si je SELECT NetObjectID, cas .... A partir des données .... je reçois l'erreur comme ci-dessus, mais ce que je ne comprends tout à fait est que si j'ai ceci: SELECT max (cas rn quand 1 puis fin RawStatus) comme actuel, cas .... a partir des données .... Je reçois le chiffre actuel, ainsi que Delta. – MarkKneen

Questions connexes