注意:这适用于 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() 不一定会给您所需的内容。您可能必须自己计算然后创建五分位数。请参阅三月组 >> 所有都是 42 美元,但它们被放入了 3 个不同的五分之一。它也低于其他 Quintile 3 的价格。所以检查它是你想要的。
最后,最好添加一个为您预先计算日期部分的日期维度表,然后将 JOIN 添加到您的主子查询中,但这是一个完全不同的讨论。