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

如您所见,人们可能有多个地址。假设一个人拥有的最大地址数是 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 lane”没有出现

我一直在阅读stackoverflow上显示的其他示例,但我不确定数据透视表是否适合我的需要,因为地址都不同

提前感谢您提供的任何帮助!

4

3 回答 3

6

你可以转动它。关键是按更新的降序将 row_numbers 分配给地址。这会产生列名 1、2 和 3(以及 4、5 - 但这些将被 pivot 命令忽略)。

这是带有示例的 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()

由于您只需要三个地址列,这可能是合适的。该解决方案不适用于非固定数量的列。

;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

您可以考虑使用两个查询:

  • 第一个使用 DISTINCT 键来获取唯一的“名称”。

  • 第二个,在唯一名称的循环中,使用 TOP 子句(在您的情况下为 TOP 3)和“ORDER BY Updated DESC”规范为每个名称获取 3 个最近的地址。

  • 当然,可以使用合适的 JOIN 组合查询。

于 2012-09-04T08:36:50.933 回答