由三列SQL中的两个分组

时间:2014-07-15 16:55:48

标签: sql group-by max teradata

我觉得这应该很容易,但我似乎无法弄明白。

我有一个包含四列的表格。三列有类别的文本描述。第四列计算前三列的串联在原始表中出现的次数。

表格看起来像这样。

Vertical   Cat       Sub-Cat       Counts
Auto      Cars       Sports Cars   9
Auto      Cars       Sedan         20
Auto      SUV        Luxary        21
Auto      SUV        Mid-Range     8

目标是选择Vertical,Cat和Sub-Cat,以获得独特版本的垂直和猫的最高“数量”。

因此,查询将返回以下内容。

Vertical   Cat       Sub-Cat       Counts
Auto      Cars       Sedan         20
Auto      SUV        Luxary        21

我尝试使用Max()来选择最高'计数',但我必须按照TD13上非聚合组的所有值进行分组。有关如何实现这一目标的任何建议吗?

2 个答案:

答案 0 :(得分:3)

您可以将旧式SQL与相关子查询

一起使用
select *
from tab as t1
where counts = 
 ( select max(counts) 
   from tab as t2
   where t1.Vertical = t2.Vertical
     and t1,Cat = t2.Cat
 )

或多列子查询或带有group by的派生表的连接,但所有应该得到类似的计划。

最有效的版本(也是最容易编写的)通常是一个窗口化聚合函数:

select *
from tab
qualify row_number() 
        over (partition by Vertical, Cat 
        order by Counts desc) = 1

答案 1 :(得分:0)

  1. 通过选择最大计数来形成您的汇总查询,按您要汇总的字段进行分组 - 垂直和猫
  2. 然后将该查询的结果用作连接回表的子查询,以选择您想要的其他字段 - 本例中为Sub-Cat
  3. 像这样的伪sql:

    SELECT *
    FROM <table>
    INNER JOIN 
    (
       SELECT Vertical, Cat, MAX(Counts)
       FROM <table>
       GROUP BY Vertical, Cat
    ) MY_AGGREGATE
    ON MY_AGGREGATE.Vertical = <table>.Vertical 
    AND MY_AGGREGATE.Cat = <table>.Cat
    AND MY_AGGREGATE.MAX(Counts) = <table>.Counts