1

私のアドレステーブルは次のようになります。

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 つの異なるタイプのアドレスがあります。結果が、addressTypeID 1 の優先順位を持つ personID でグループ化されることを望みます。その人が 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

私の質問に答えてくれてありがとう

4

4 に答える 4

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
于 2012-12-20T21:27:17.997 に答える
1

何かのようなもの

SELECT AddressTable.* FROM AddressTable INNER JOIN 

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

AddressTable.AddressID = MinIdTable.MinIdTable
于 2012-12-20T21:27:19.017 に答える
1

これは、group by としてではなく、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

case句でステートメントを使用しorder byて、優先レベルを指定していることに注意してください。

于 2012-12-20T21:28:53.857 に答える