2014-07-15 37 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

尼斯點,由於 –