2015-10-04 242 views
0

我有以下查詢:計算添加百分位數(或四分位數),以現有的SQL查詢

SELECT "Cc EV PS" AS factor, 
     "GICS Sector/" & t1.[GICS Sector], 
     #8/14/2015# AS calcdate, 
     (Sum((t1.[Cc EV PS]-z.TheAvg)^4)/Count(t1.[Cc EV PS]))/(Sum((t1.[Cc EV PS]-z.TheAvg)^2)/Count(t1.[Cc EV PS]))^2 AS Kurtosis 
FROM tbl_DatedModel_2015_0929_0 AS t1 
    INNER JOIN 
      (SELECT t2.[GICS Sector], Avg(t2.[Cc EV PS]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING Count(t1.[Cc EV PS]) > 0; 

那我試圖25Percentile添加到上面的SQL。下面是25Prercentile的SQL:

SELECT TOP 1 0.75*(SELECT Max(tp2.[Cc EV PS]) 
        FROM tbl_DatedModel_2015_0929_0 AS tp2 
        WHERE tp2.[Cc EV PS] IN 
         (SELECT TOP 25 PERCENT tp3.[Cc EV PS] 
         FROM tbl_DatedModel_2015_0929_0 AS tp3 
         WHERE tp3.[Cc EV PS] Is Not Null 
         ORDER BY tp3.[Cc EV PS])) + 0.25* 
          (SELECT Min(tp4.[Cc EV PS]) 
          FROM tbl_DatedModel_2015_0929_0 AS tp4 
          WHERE tp4.[Cc EV PS] IN 
           (SELECT TOP 75 PERCENT tp5.[Cc EV PS] 
           FROM tbl_DatedModel_2015_0929_0 AS tp5 
           WHERE tp5.[Cc EV PS] Is Not Null 
           ORDER BY tp5.[Cc EV PS] DESC)) AS 25Percentile 
FROM tbl_DatedModel_2015_0929_0 AS tp1; 

到底25Percentile應產生爲以類似於峯度是在所述第一查詢中計算出的方式,第一查詢創建子集的百分計算(即,在數據的子集)。上面爲25Percentile提供的SQL只是計算所有數據。

這必須在MS Access 2013中工作。我有一個超級慢的VBA答案,因此更喜歡純粹的SQL答案。

第一個查詢完全按照我希望它工作的方式工作,除了我需要包含25Percentile計算。

編輯: 如果你感到困惑,第一個查詢以這種方式被使用,但我並沒有包括所有的,因爲我認爲這將只是分散:

SELECT "Cc EV PS" AS factor, 
     "GICS Sector/" & t1.[GICS Sector], 
     #8/14/2015# AS calcdate, 
     (Sum((t1.[Cc EV PS]-z.TheAvg)^4)/Count(t1.[Cc EV PS]))/(Sum((t1.[Cc EV PS]-z.TheAvg)^2)/Count(t1.[Cc EV PS]))^2 AS Kurtosis 
FROM tbl_DatedModel_2015_0929_0 AS t1 
    INNER JOIN 
      (SELECT t2.[GICS Sector], Avg(t2.[Cc EV PS]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING Count(t1.[Cc EV PS]) > 0 
UNION ALL 
SELECT "USD Market Cap" AS factor, 
     "GICS Sector/" & t1.[GICS Sector], 
     #8/14/2015# AS calcdate, 
     (Sum((t1.[USD Market Cap]-z.TheAvg)^4)/Count(t1.[USD Market Cap]))/(Sum((t1.[USD Market Cap]-z.TheAvg)^2)/Count(t1.[USD Market Cap]))^2 AS Kurtosis 
FROM tbl_DatedModel_2015_0929_0 AS t1 
    INNER JOIN 
      (SELECT t2.[GICS Sector], Avg(t2.[USD Market Cap]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING Count(t1.[USD Market Cap]) > 0 
UNION ALL SELECT "IU Mkt Cap" AS factor, 
     "GICS Sector/" & t1.[GICS Sector], 
     #8/14/2015# AS calcdate, 
     (Sum((t1.[IU Mkt Cap]-z.TheAvg)^4)/Count(t1.[IU Mkt Cap]))/(Sum((t1.[IU Mkt Cap]-z.TheAvg)^2)/Count(t1.[IU Mkt Cap]))^2 AS Kurtosis 
FROM tbl_DatedModel_2015_0929_0 AS t1 
    INNER JOIN 
      (SELECT t2.[GICS Sector], Avg(t2.[IU Mkt Cap]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING Count(t1.[IU Mkt Cap]) > 0; 

編輯:這包括25Percentile(第一四分位數),但它不像GrtIs集成那樣集合在一起,就像Kurtosis一樣,它爲所有GICS部門產生相同的價值。它應該產生的範圍子集的一個答案(GICS行業):

SELECT "Cc EV PS" AS factor, 
     "GICS Sector/" & t1.[GICS Sector], 
     #8/14/2015# AS calcdate, 
     (Sum((t1.[Cc EV PS]-z.TheAvg)^4)/Count(t1.[Cc EV PS]))/(Sum((t1.[Cc EV PS]-z.TheAvg)^2)/Count(t1.[Cc EV PS]))^2 AS Kurtosis, 
     0.75*(SELECT Max(tp2.[Cc EV PS]) 
       FROM tbl_DatedModel_2015_0929_0 AS tp2 
       WHERE tp2.[Cc EV PS] IN 
        (SELECT TOP 25 PERCENT tp3.[Cc EV PS] 
        FROM tbl_DatedModel_2015_0929_0 AS tp3 
        WHERE tp3.[Cc EV PS] Is Not Null 
        ORDER BY tp3.[Cc EV PS])) + 0.25* 
         (SELECT Min(tp4.[Cc EV PS]) 
         FROM tbl_DatedModel_2015_0929_0 AS tp4 
         WHERE tp4.[Cc EV PS] IN 
          (SELECT TOP 75 PERCENT tp5.[Cc EV PS] 
          FROM tbl_DatedModel_2015_0929_0 AS tp5 
          WHERE tp5.[Cc EV PS] Is Not Null 
          ORDER BY tp5.[Cc EV PS] DESC)) AS 25Percentile 
FROM tbl_DatedModel_2015_0929_0 AS t1 
    INNER JOIN 
      (SELECT t2.[GICS Sector], Avg(t2.[Cc EV PS]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING Count(t1.[Cc EV PS]) > 0 

EDIT(最快!):這將得到四分/百分度和峯度快兩倍,(我想它,我收到了正確的後回答我以前的方法):

SELECT "Cc EV PS" AS factor, "GICS Sector/" & t1.[GICS Sector] AS Expr1, 
    #8/14/2015# AS calcdate, 
(Sum((t1.[Cc EV PS]-z.TheAvg)^4)/Count(t1.[Cc EV PS]))/(Sum((t1.[Cc EV PS]-z.TheAvg)^2)/Count(t1.[Cc EV PS]))^2 AS Kurtosis, 
      (select max([Cc EV PS]) from tbl_DatedModel_2015_0929_0 where tbl_DatedModel_2015_0929_0.[Cc EV PS] in 
(select top 25 percent [Cc EV PS] from tbl_DatedModel_2015_0929_0 
where t1.[GICS Sector] = tbl_DatedModel_2015_0929_0.[GICS Sector] order by [Cc EV PS])) AS 25Percentile 
FROM tbl_DatedModel_2015_0929_0 AS t1 INNER JOIN (SELECT t2.[GICS Sector], Avg(t2.[Cc EV PS]) AS TheAvg 
      FROM tbl_DatedModel_2015_0929_0 AS t2 
      GROUP BY t2.[GICS Sector]) AS z ON t1.[GICS Sector] = z.[GICS Sector] 
GROUP BY t1.[GICS Sector] 
HAVING (((Count(t1.[Cc EV PS]))>0)); 

回答

1

我不知道的MS Access,但這些替代品應該做的伎倆:

WHERE tp5.[Cc EV PS] Is Not Null -> 
WHERE tp5.[Cc EV PS] Is Not Null and tp5.[GICS Sector] = t1.[GICS Sector] 


WHERE tp3.[Cc EV PS] Is Not Null -> 
WHERE tp3.[Cc EV PS] Is Not Null and tp3.[GICS Sector] = t1.[GICS Sector] 
+0

僅供參考 - 我發現了一個方法來獲得四分位數已經是我做這件事的速度了。看起來我最後的編輯(剛剛添加它)。 – mountainclimber