2013-05-10 75 views
0

我面臨一個特別困難(對於我的技能水平)選擇查詢。 我有一些數據庫中的數據是這樣的: 4列(maleName/femaleName/size/id)。 列數據或多或少都是不言自明的。我有一個男性的名字,一個女性的名字大小和一個ID(只得到值1或2)相應的每列。唯一的問題是男性和女性的名字(作爲夫妻)出現超過1次。postgreSQL最大選擇取決於組

Database example. 
# | MaleName | FemaleName | Size | ID 
    1 - John - Mary - 9 - 1 
    2 - Nick - Stacey - 6 - 1 
    3 - Mike - Rachel - 2 - 1 
    4 - John - Mary - 3 - 2 
    5 - Mike - Rachel - 20 - 2 
    6 - Nick - Stacey - 13 - 2 
    etc... 

我需要的是一個選擇查詢將返回每對夫婦的最大(大小)和它所屬的ID ...

Result example. 
# | MaleName | FemaleName | Size | ID 
1 - John - Mary - 9 - 1 
2 - Nick - Stacey - 13 - 2 
3 - Mike - Rachel - 20 - 2 

什麼我已經這樣做的遠是這樣的:

select a.Mname,a.Fname,a.size 
from mytable a , mytable b 
where a.id=b.id and 
a.size in (select max(a.size) from mytable a , mytable b where a.id=b.id) 
group by a.Mname, a.Fname, a.size; 

我不知道我是否接近或完全錯誤。這雖然返回1結果。它可能需要一些調整或全部重寫。任何幫助將不勝感激!在此先感謝你們!

親切的問候。

回答

2

一般情況下,我用解決這些row_number()問題,因爲這部作品在許多數據庫:

select mname, fname, size, id 
from (select t.*, 
      row_number() over (partition by t.mname, t.fname order by t.size desc) as seqnum 
     from mytable t 
    ) t 
where seqnum = 1 

功能row_number()組內的順序號分配給行。在這種情況下,具有相同對名稱的所有行都將被編號(partition by子句)。編號從最大尺寸的行開始(order by size desc)。你想最大的尺寸,使具有1

的Postgres的序列號還支持distinct on語法,可以做同樣的事情,但是那是相當的特定數據庫。

+0

非常感謝。不幸的是,我嘗試了你給我的東西,儘管它偏袒一些人(分組夫婦等),但它沒有過濾掉那些尺碼較小的夫婦。 – 2013-05-10 21:41:22

+0

@GeorgeElementSotiriou。 。 。你的查詢中有'where seqnum = 1'嗎?你的分區子句只包含兩個名字嗎? – 2013-05-10 21:48:14

+0

Tha對兩者的回答都是肯定的。此外,我已經更正了幾分鐘前編輯過的「mytable t」部分,因爲我發現它應該是我自己的。仍然劃分,我有我的相同的「夫婦」一個接一個地下降的尺寸,但它沒有排除最小號碼的dublicate夫婦。對不起,讓你的生活辛苦......! :( – 2013-05-10 21:53:30