2014-07-15 36 views
0

我觉得这应该很容易,但我似乎无法弄清楚。由三列中的两列组成SQL

我有一个四列的表。三列具有类别的文字说明。第四列计算前三列的连接在原始表中出现的次数。

表看起来像这样。

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  Counts 
Auto  Cars  Sedan   20 
Auto  SUV  Luxary  21 

我试着使用MAX()选择最高的“罪名”,但我通过对TD13非集合组的所有值都集团。有关如何完成此任务的任何建议?

回答

3

您可以使用旧式SQL与相关小号ubquery

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

或多列子查询或连接到一组由一个派生表,但都应该得到一个类似的计划。

最有效的版本(和最容易写)通常是加窗聚合函数:

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

1为窗聚合函数溶液。只有T-SQL?已经完全忘记了这种方法已经离开Sql Server几年了。 –

+1

@LongboatHarry:不,QUALIFY是Teradata特定的语法,而不是SQL Server,但是Teradata被标记为:-)在所有其他DBMS中,您需要将ROW_NUMBER嵌套在派生表中,并使用外部查询中的WHERE进行过滤。 – dnoeth

0
  1. 通过选择最大计数形成你的汇总查询,通过你要聚集字段分组 - 垂直和猫
  2. 然后使用该查询作为连接回表中选择一个子查询的结果其他字段你想要的 - 子猫在这种情况下

因此,像这样的伪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 
+0

AND MY_AGGREGATE.MaxCounts =

.CAT – dnoeth

+0

尼斯点,由于 –