协助 PERCENTILE_CONT 函数和 GROUP 错误

Assistance with PERCENTILE_CONT function and GROUP By error

全部,

我在使用以下查询时遇到问题。我试图从我们的数据库中获取过去 3 年的统计数据,但我不断收到错误消息:

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

我知道它与 DATA1 列有关,但我对使用 PERCENTILE_CONT 函数不够熟悉,不知道解决方案是什么。

有人有什么想法吗?

WITH Q AS
(
    SELECT        stagingPLM.dbo.ITEM_CODES.ITEM_CODE, 
                    AVG(OC_VDATA.DATA1) AS Mean, 
                    STDEVP(OC_VDATA.DATA1) AS StandardDev,
                    PERCENTILE_CONT(0.5) 
                        WITHIN GROUP (ORDER BY OC_VDATA.DATA1) 
                        OVER (PARTITION BY stagingPLM.dbo.ITEM_CODES.ITEM_CODE) AS Median
    FROM            OC_VDATA INNER JOIN
                             OC_VDAT_AUX ON OC_VDATA.PARTNO = OC_VDAT_AUX.PARTNOAUX 
                                AND OC_VDATA.DATETIME = OC_VDAT_AUX.DATETIMEAUX INNER JOIN
                             stagingPLM.dbo.ITEM_CODES ON LEFT(OC_VDATA.PARTNO, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO 
                                AND LEFT(OC_VDAT_AUX.PARTNOAUX, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO
    WHERE        (OC_VDAT_AUX.UDL28 LIKE '%PLASTIC%') 
                    AND (RIGHT(OC_VDATA.PARTNO, 6) = '036150')
                    AND (CAST(OC_VDAT_AUX.UDL40 AS DATETIME)
                        BETWEEN CONVERT(datetime, '2019-05-18 00:00:00', 102) AND CONVERT(datetime, '2022-05-18 00:00:00', 102))
    GROUP BY stagingPLM.dbo.ITEM_CODES.ITEM_CODE
)

SELECT * FROM Q

错误是因为代码WITHIN GROUP (ORDER BY OC_VDATA.DATA1)。 您正在基于 ITEM_CODE 执行 GROUP BY(用于 AVG 和 STDEVP),而 ORDER BY 位于 OC_VDATA.DATA1 上用于 Window 函数。

最好使用 Window 函数计算 AVGSTDEVPPERCENTILE_CONT,而不是一半通过 GROUP BY 一半通过 Window 函数。

通过考虑重现问题所需的最少列数,您可以按如下方式重写查询以获得所需的输出。

SELECT DISTINCT item_codes.item_code,
                Avg(oc_vdata.data1)
                  over(
                    PARTITION BY item_codes.item_code) AS Mean,
                Stdevp(oc_vdata.data1)
                  over(
                    PARTITION BY item_codes.item_code) AS StandardDev,
                Percentile_cont(0.5)
                  within GROUP (ORDER BY oc_vdata.data1) over (
                    PARTITION BY item_codes.item_code) AS Median
FROM   oc_vdata
       inner join item_codes
               ON Left(oc_vdata.partno, 12) = item_codes.spec_no 

DB Fiddle: Try it here

重现错误的最少步骤:

SELECT item_codes.item_code,
       Avg(oc_vdata.data1)    AS Mean,
       Stdevp(oc_vdata.data1) AS StandardDev
FROM   oc_vdata
       INNER JOIN item_codes
               ON LEFT(oc_vdata.partno, 12) = item_codes.spec_no
GROUP  BY item_codes.item_code
ORDER  BY oc_vdata.data1 -- This will cause the error