2017-01-20 1 views
1

Я пытаюсь использовать PERCENTILE_DISC с рядом других встроенных функций агрегата. Код, который я пытаюсь читается как это, но он не:Использование PERCENTILE_DISC с функциями агрегации

SELECT 
    [DataPoint] AS [DataPoint], 
    MIN([Value]) AS [Value MIN], 
    MAX([Value]) AS [Value MAX], 
    AVG([Value]) AS [Value AVG], 
    PERCENTILE_DISC(0.5) 
     WITHIN GROUP 
     (ORDER BY [Value]) 
     OVER 
     (PARTITION BY [DataPoint]) 
     AS MedianCont 
    FROM [Table] AS [Table] 
    WHERE ([DataPoint] 
     IN (
      ... 
     ) 
    ) 
    GROUP BY [DataPoint] 

Так это работает ...

SELECT 
    Distinct [DataPoint], 
    PERCENTILE_DISC(0.5) 
    WITHIN GROUP 
    (ORDER BY [Value]) 
    OVER 
    (PARTITION BY [DataPoint]) 
    AS MedianCont 
    FROM [Table] AS [Table] 
    WHERE ([DataPoint] 
     IN (
      ... 
     ) 
    ) 

И это работает ...

SELECT 
    [DataPoint] AS [DataPoint], 
    MIN([Value]) AS [Value MIN], 
    MAX([Value]) AS [Value MAX], 
    AVG([Value]) AS [Value AVG] 
    FROM [Table] AS [Table] 
    WHERE ([DataPoint] 
     IN (
      ... 
     ) 
    ) 
    GROUP BY [DataPoint] 

Но когда я пытаюсь чтобы объединить их, он хочет, чтобы я объявлял Value в предложении Group By, чего я не хочу, потому что мне нужен отдельный список DataPoint, а не значение за DataPoint.

Column 'Value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

ответ

3

Казалось бы, что с помощью over clause, создавая тем самым «функцию окна», отделяет агрегатную функцию от оператора выбора.

SELECT 
    Distinct [DataPoint], 
    MIN([Value]) OVER (PARTITION BY [DataPoint]) AS [Value MIN], 
    MAX([Value]) OVER (PARTITION BY [DataPoint]) AS [Value MAX], 
    AVG([Value]) OVER (PARTITION BY [DataPoint]) AS [Value AVG], 
    PERCENTILE_DISC(0.5) 
     WITHIN GROUP 
     (ORDER BY [Value]) 
     OVER 
     (PARTITION BY [DataPoint]) 
     AS MedianCont 
    FROM [Table] AS [Table] 
    WHERE ([DataPoint] 
     IN (
      ... 
     ) 
    )