2012-12-20 26 views
1

我的地址表看起來像這樣:組由ID(未主鍵)與多個類型的地址

AddressID Street  City   AddressTypeID PersonID 
1   1st 2ave  Edmonton  1    10 
2   3st 6ave  Edmonton  2    10 
3   8st 5ave  Edmonton  5    10 
4   7st 4ave  Edmonton  2    11 
5   2st 9ave  Edmonton  3    12 
6   9st 2ave  Edmonton  5    12 

在該表中的PERSONID 10具有3種不同類型的地址。 我想結果是PERSONID組具有addressTypeID 1的優先級,如果人沒有了addresstypeID 1然後使用addresstypeID 5

我想輸出是這樣的:

AddressID Street  City   AddressTypeID PersonID 
1   1st 2ave  Edmonton  1    10 
4   7st 4ave  Edmonton  2    11 
6   9st 2ave  Edmonton  5    12 

謝謝你回答我的問題

+3

[你嘗試過什麼?](http://www.whathaveyoutried.com) – Kermit

+0

如果映射AddressTypeID = 1到'1',AddressTypeID = 5到'2'和AddressTypeID = 2到'NULL',這只是最大的每組問題的另一個變體。不幸的是,我不知道這是如何在MSSQL中完成的。 ;) – AndreKR

+0

PersonID 11的邏輯是什麼?他既沒有也沒有5.一個人可能同時擁有'AddressTypeID'''和'2'而不是1或5嗎?你對所有可能的'AddressTypeID'值有特定的優先順序嗎? – Pondlife

回答

1

這是最簡單的不作爲組通過,但通過使用row_number()功能:

select a.* 
from (select a.*, 
      row_number() over (partition by personId 
           order by (case when AddressTypeId = 1 then 1 
               when AddressTYpeId = 5 then 2 
               else 3 
              end) 
           ) as seqnum 
     from addresses a 
    ) a 
where seqnum = 1 

請注意,我的order by子句中使用case語句指定優先級。

+0

+1 ...偉大的思想者都一樣嗎? –

4
; with cte as (
    select 
     a.AddressID, a.Street, a.City, a.AddressTypeID, a.PersonID, 
     row_number() over(
      partition by a.PersonID 
      order by case a.AddressTypeID 
       when 1 then 1 
       when 5 then 2 
       else 3 
      end 
     ) as rn 
    from address a 
) 
select * 
from cte 
where rn = 1 
1

喜歡的東西

SELECT AddressTable.* FROM AddressTable INNER JOIN 

(SELECT PersonID, MIN(AddressID) as MinAddressID GROUP BY PersonID) AS MinIdTable ON 

AddressTable.AddressID = MinIdTable.MinIdTable 
+1

備用順序是1,然後是5,從不是2. – AndreKR

0

首先,通過子查詢篩選表格,以僅包含AddressTypeID爲1或5的行。然後選擇每人最低的AddressTypeID單一個(因爲你要在1到5的優先級)

select 
    * 
from 
    (select * from myaddresstable 
    where AddressTypeID in (1, 5)) 
where 
    row_number() over (partition by PersonID order by AddressTypeID asc) = 1