注:これはMS SQL 2008+に適用されます。
私はあなたのデータ構造がどのようなものか知らないが、多分
/* Test Data */
WITH stocks AS (
/* Jan = 10 = 2 per quint */
SELECT 'abc' AS StockName, 100.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'def' AS StockName, 99.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'ghi' AS StockName, 50.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'jkl' AS StockName, 50.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'mno' AS StockName, 75.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'pqr' AS StockName, 77.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'stu' AS StockName, 20.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'vwx' AS StockName, 10.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT 'yz1' AS StockName, 2.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
SELECT '234' AS StockName, 1.00 AS StockPrice, '20170101' AS PriceDate UNION ALL
/* Feb = 7 = uneven quints */
SELECT 'abc' AS StockName, 1.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'def' AS StockName, 2.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'ghi' AS StockName, 20.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'jkl' AS StockName, 55.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'mno' AS StockName, 50.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'pqr' AS StockName, 100.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
SELECT 'stu' AS StockName, 90.00 AS StockPrice, '20170201' AS PriceDate UNION ALL
/* Mar = 3 = not enough for 5 quints. */
SELECT 'abc' AS StockName, 42.00 AS StockPrice, '20170301' AS PriceDate UNION ALL
SELECT 'jkl' AS StockName, 42.00 AS StockPrice, '20170301' AS PriceDate UNION ALL
SELECT 'vwx' AS StockName, 42.00 AS StockPrice, '20170301' AS PriceDate
)
/* Query */
SELECT y.StockName, y.StockPrice, y.PriceMonth, y.quintile
FROM (
SELECT x.StockName, x.StockPrice, month(x.PriceDate) AS PriceMonth
, NTILE(5) OVER (PARTITION BY month(x.PriceDate) ORDER BY x.StockPrice DESC) AS quintile
FROM stocks x
GROUP BY x.StockName, x.StockPrice, month(x.PriceDate)
) y
ORDER BY y.PriceMonth, y.quintile ASC
の線に沿って何かは、あなたがそれを表示する場合次に、あなただけのことができ
StockName StockPrice PriceMonth quintile
abc 100.00 1 1
def 99.00 1 1
pqr 77.00 1 2
mno 75.00 1 2
ghi 50.00 1 3
jkl 50.00 1 3
stu 20.00 1 4
vwx 10.00 1 4
yz1 2.00 1 5
234 1.00 1 5
pqr 100.00 2 1
stu 90.00 2 1
jkl 55.00 2 2
mno 50.00 2 2
ghi 20.00 2 3
def 2.00 2 4
abc 1.00 2 5
abc 42.00 3 1
jkl 42.00 3 2
vwx 42.00 3 3
あなた
を与えます五分音符でソート/グループ化します。
また、上記の例は、NTILE()があなたの探しているものを提供するとは限りません。計算してから自分で五分木を作成する必要があるかもしれません。 March group >> allは42ドルですが、3つの異なるクインタイルに入れられています。他のQuintile 3価格の下にもあります。だからそれがあなたが望むものであることを確認してください。
最後に、日付部分を事前計算する日付ディメンションテーブルを追加してから、メインサブクエリにJOIN
を追加する方が良いでしょうが、それは全く異なる議論です。
画像が表示されません。比率を計算するために現在どの式を使用していますか?ウィンドウ関数(https://docs.microsoft.com/en-us/sql/t-sql/functions/ranking-functions-transact-sql)を使用して五分木を計算することができます。どのような味とバージョンのSQLを使用していますか? – Shawn
また、https://stackoverflow.com/help/mcve <<<非常に役立ちます。 – Shawn