2017-03-12 63 views
0

我試圖找到一種方法來選擇表中每個用戶的最高值的行。除非我誤解,我不能簡單地通過每一行Oracle SQL select max「for each」row

例如組,說我有這樣一個當前查詢:

select u.userid, p.region, count(u.userid) count 
from userTable u join purchasesTable p on u.userid = p.userid 
group by (u.userid, p.region) 

,並讓目前這樣的結果:

id   Region  COUNT 
---------- ----------- ---------- 
1   East  1 
2   West  1 
3   North  1 
1   North  2 
2   East  3 
3   West  4 

我想篩選結果以顯示每個用戶購買量最高的地區(而不是總購買量最高的地區或用戶)。

id   Region  COUNT 
---------- ----------- ---------- 
1   North  2 
2   East  3 
3   West  4 

我不能讓group by子句只包含userid,因爲我想包含區域。但我不希望地區專欄被納入決策。我考慮將這個包裝在另一個查詢中,然後採用最大值,但是我沒有用這種方法取得任何成功。我也想過使用distinct關鍵字,但是這也不能解決這個問題。

如果有人能指引我正確的方向,我會非常感激。

+0

如果有並列爲同一ID最高計數兩個區域?你是否需要返回所有這些行,或者只是其中一個 - 如果「只有一個」,哪一個?例如,假設對於一個新的id,比如'id = 4',最高的計數是4,並且對於East和North來說這個計數是相同的。輸出應該顯示爲'id = 4'? – mathguy

回答

0

你可以用row_number()做到這一點:

select userid, region, cnt 
from (select p.userid, p.region, count(*) as cnt, 
      row_number() over (partition by p.userid order by count(*) desc) as seqnum 
     from purchasesTable p 
     group by p.userid, p.region 
    ) ur 
where seqnum = 1; 

注:我刪除從查詢中join。對於您所說的查詢,沒有必要,因爲p.useridu.userid相同。當然,如果你想要usersTable的其他信息,那麼你需要join來獲得它。

0

試試這個,你的查詢裏面from clausole:

select 
id,region,max(count_) 
from 
(
    select u.userid, p.region, count(u.userid) count as count_ 
    from userTable u join purchasesTable p on u.userid = p.userid 
    group by (u.userid, p.region) 
) exe 
group by id,region 
+1

我試過這個,但不幸的是它根本沒有改變輸出。我認爲這是因爲(id,region)組之間沒有重複的條目。就像是如果有多個條目具有相同的ID /區域,那麼我認爲它會過濾掉這些。但我認爲這不會成爲訣竅。 – Pancake