在分区依据列上计算条件中位数

时间:2018-04-09 19:28:42

标签: sql-server-2012

我需要计算标签为“Tag”的项目的中位数和具有类似Item_Names的组,例如C,E和F. “标签C1”,“标签C2”和“标签C3”的中位数。对于其余项目,将根据Label和Item_Name计算中位数。

Label  ||  Item_Name    ||  Price
Tag    ||  Tag C1       ||   231
Tag    ||  Tag C2       ||   312
Tag    ||  Tag C3       ||   416
Tag    ||  Tag E1       ||   523
Tag    ||  Tag E2       ||   152
Tag    ||  Tag E3       ||   629
Tag    ||  Tag E4       ||   29
Tag    ||  Tag E5       ||   727
Tag    ||  Tag F1       ||   671
Tag    ||  Tag F2       ||   1002
Tag    ||  Tag F3       ||   96
No_Tag ||      G        ||   61
No_Tag ||      H        ||   802
No_Tag ||      H2       ||   36
No_Tag ||      J3       ||   102
No_Tag ||      K        ||   546
No_Tag ||      M        ||   238

下面提到的查询在整个项目集中返回中位数

PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label) med_price

我也试过了CASE,但它仍然给出了相同的结果

CASE    
    WHEN Item_Name LIKE ('Tag C%') THEN PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label)
    WHEN Item_Name LIKE ('Tag E%') THEN PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label)
    WHEN Item_Name LIKE ('Tag F%') THEN PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label)
    ELSE PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label, Item_Name)
END AS med_price,

如何在“Label”分区时包含基于“Item_Name”的条件?

1 个答案:

答案 0 :(得分:1)

您可以在“Item_Name”上使用case语句 - 这是基于Item_Name的前五个字符作为您的标准的建议:

    PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY Price) OVER (PARTITION BY Label, CASE WHEN Label = 'Tag' THEN Left(Item_Name,5) ELSE Item_Name END) AS Med_Price