2017-10-14 4 views
0

CTEや派生テーブルなどを利用せずにウィンドウ関数を使用して移動パーセンタイルを取得するより良い方法はありますか?私は窓関数を利用して1つのクエリにすべてを収めたいと思っていましたが、それをパーセンタイル値に変換する時間がありました。私が考えることができる唯一の解決策は、数値を作成し、テーブルで数学を行うことでした。これを行うもっと合理化された方法があったらちょうど涼しいであろうか?パーセンタイルの決定ラグ、リード、および現在の行との差は、ウィンドウ関数を使用して計算されますか?

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 

これは、私がテストの準備でコードについて学ぶために勉強しているところです。データは、トレーニングdb TSQL_2012にあるsales.ordervaluesテーブルから取得されます。

CTE内に配置することなく、leadvaldiff列とlagvaldiff列をパーセンテージに変換するにはどうすればよいですか?

dataset

+0

おそらく、小さなデータサンプルを提供できますか? また、今では、あるレコードの値を次のレコードと前のレコードの値と比較しています。それはあなたが達成したい、そしてなぜですか? – dybzon

+0

はい、サンプルデータセットと、結果がどのように見えるかのサンプルを提供してください。 –

+0

[dataset](https://docs.google.com/spreadsheets/d/1991QZ8pzoZmfIxJcHv21Cm52Z-k0joerw7jngRYMwCQ/edit?usp=sharing)ご覧いただきありがとうございます! – Zeluvius

答えて

0

私は何かが足りないか、これはあなたが探しているものであるだろうか?

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、私はなぜ窓関数に分割しようとしなかったのかわかりません。あなたは大変ありがとうございました^ _ ^ありがとうございました – Zeluvius

+0

これを合格とマークしてください。 –

+0

申し訳ありませんが、このサイトをまだ見つけていない、灰色のチェックマークを知っていた人は、 – Zeluvius

関連する問題