簡體   English   中英

按三列中的兩列分組SQL

[英]Group by two of three columns 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上非聚集組的所有值進行分組。 關於如何做到這一點的任何建議?

您可以將老式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的派生表的聯接,但所有人都應獲得類似的計划。

最有效的版本(並且最容易編寫)通常是Windowed Aggregate Function:

select *
from tab
qualify row_number() 
        over (partition by Vertical, Cat 
        order by Counts desc) = 1
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM