2

ここに私の問題があります:

名前と住所を含むテーブルがあります。

Name  |  Address       | Updated
----------------------------------
a     |  12 lane       | 1/1/2011
b     |  34 avenue     | 1/1/2011
c     |  56 district   | 1/1/2011
a     |  78 avenue     | 8/8/2011
b     |  90 lane       | 8/8/2011
a     |  83 district   | 9/9/2011
a     |  39 road       | 10/10/2011

ご覧のとおり、人々は複数のアドレスを持つことができます。1 人が持つアドレスの最大数が 5 であるとしましょう。

テーブルが次のようになるように、各人の最新の 3 つのアドレスを取得することにのみ関心があります。

Name  |  Address_1      |   Address_2       |  Address_3
--------------------------------------------------------------
a     | 78 avenue       |   83 district     | 39 road
b     | 34 avenue       |   90 lane         | NULL
c     | 56 district     |   NULL            | NULL

a の最初のエントリ「12 レーン」は表示されないことに注意してください

stackoverflow に示されている他の例を読んでいますが、アドレスがすべて異なるため、ピボットテーブルが必要なものに適しているかどうかわかりません

ご協力いただきありがとうございます。

4

3 に答える 3

6

ピボットできます。キーポイントは、更新の降順で行番号をアドレスに割り当てることです。これにより、列名 1、2、および 3 (および 4、5 - ただし、これらはピボット コマンドによって無視されます) が生成されます。

これが例のSql Fiddleです

select name, 
       [1] Address_1,
       [2] Address_2,
       [3] Address_3
from
(
  select name,
         address,
         row_number() over (partition by name
                            order by updated desc) rn
    from table1
) o
pivot (min(address) for rn in ([1], [2], [3])) p
于 2012-09-04T08:17:04.383 に答える
1

を使用した簡単なクエリを次に示します。ROW_NUMBER()

必要な住所列は 3 つだけなので、これが適している可能性があります。このソリューションは、固定されていない量のカラムには適していません。

;with testdata(Name, Address, Updated)
as
(
select 'a','12 lane',convert(datetime, '1/1/2011')
union all
select 'b','34 avenue',convert(datetime, '1/1/2011')
union all
select 'c','56 district',convert(datetime, '1/1/2011')
union all
select 'a','78 avenue',convert(datetime, '8/8/2011')
union all
select 'b','90 lane',convert(datetime, '8/8/2011')
union all
select 'a','83 district',convert(datetime, '9/9/2011')
union all
select 'a','39 road',convert(datetime, '10/10/2011')
)
,tmp
as
(
select  * 
        ,row_number() over(PARTITION by Name order by Updated desc) as rn
from testdata
)
select  x.Name
        ,x.Address
        ,y.Address
        ,z.Address
from    tmp x
left join   tmp y
    on  x.Name = y.Name
    and y.rn = 2
left join   tmp z
    on  x.Name = z.Name
    and z.rn = 3
where x.rn = 1
于 2012-09-04T08:19:23.013 に答える
0

次の 2 つのクエリを使用することを検討してください。

  • 最初に DISTINCT キーを使用して一意の「名前」を取得します。

  • 2番目は、一意の名前のループで、TOP句(この場合はTOP 3)と「ORDER BY Updated DESC」仕様を使用して、名前ごとに最新の3つのアドレスを取得します。

  • もちろん、クエリは適切な JOIN を使用して組み合わせることができます。

于 2012-09-04T08:36:50.933 に答える