2017-10-14 3 views
0

Existe-t-il un meilleur moyen d'obtenir le percentile mobile à l'aide d'une fonction Windows sans utiliser de table CTE ou dérivée, etc.? Je voulais tout mettre dans une requête en utilisant les fonctions de Windows, mais im ayant un temps fou de le convertir en une valeur centile. La seule résolution que je pouvais penser était de créer les valeurs numériques, puis faire le calcul avec la table. Juste serait cool s'il y avait une façon plus simple de le faire?Détermination du percentile Différence par rapport au décalage, au plomb et à la ligne courante en utilisant la fonction Windows?

WITH numberdata AS 
(
SELECT 
    custid 
    ,orderid 
    ,LAG(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC) as lagval 
    ,LEAD(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC) as leadval 
    ,val - LAG(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC) as lagvaldiff 
    ,val - LEAD(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC) as leadvaldiff 
    ,val 
FROM sales.ordervalues 
) 
select 
    CAST((lagval)/val AS NUMERIC(10,2)) as lagpctdiff 
    ,CAST((leadval)/val AS NUMERIC(10,2)) as leadpctdiff 
    ,CAST((lagvaldiff)/leadvaldiff AS NUMERIC(10,2)) as pctdiff 
    ,val 
    ,lagval 
from numberdata 
order by custid desc 

Ceci est juste moi étudier pour en savoir plus sur le code en préparation d'un test. Les données proviennent de la table sales.ordervalues ​​située dans la formation db TSQL_2012.

Comment puis-je convertir les colonnes leadvaldiff et lagvaldiff en un pourcentage sans le placer dans un CTE?

dataset

+0

Peut-être pourriez-vous nous fournir un petit échantillon de données? Aussi - en ce moment, vous comparez la valeur d'un enregistrement à la valeur des enregistrements suivants et précédents. Est-ce ce que vous voulez accomplir, et pourquoi? – dybzon

+0

Oui, veuillez fournir un exemple de jeu de données avec un exemple de la manière dont vous attendez que les résultats s'affichent. –

+0

[jeu de données] (https://docs.google.com/spreadsheets/d/1991QZ8pzoZmfIxJcHv21Cm52Z-k0joerw7jngRYMwCQ/edit?usp=sharing) Merci d'avoir jeté un coup d'œil! – Zeluvius

Répondre

0

Suis-je manque quelque chose ou est-ce que vous cherchez?

SELECT LAG(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC)/val as lagval 
      ,LEAD(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC)/val as leadval 
      ,(val - LAG(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC))/ 
      (val - LEAD(VAL) OVER(PARTITION BY CUSTID ORDER BY ORDERID DESC)) as pctdiff 
    FROM sales.OrderValues; 
+0

+1, ne sais pas pourquoi je n'ai pas essayé de diviser dans la fonction Windows. Sentez-vous bête maintenant, au moins maintenant je sais que vous pouvez manipuler et calculer deux fonctions fenêtrées ensemble^_^merci beaucoup – Zeluvius

+0

S'il vous plaît marquer cela comme accepté. –

+0

désolé encore figurer ce site, qui savait que la coche grise était un clicky – Zeluvius