没有已知列名称的透视

Mar*_*der 1 sql oracle pivot

我有以下数据表:

A   B
=== ===
M   2  
M   3
M   5
N   5
N   2
O   6
P   13
P   7
P   9
P   11
P   3
Run Code Online (Sandbox Code Playgroud)

现在我需要一个PIVOT(?)查询:

  • 按列A分组
  • 在B栏排序
  • 取B列中最低的3个值.
  • 将这些值放在新列B1,B2,B3中

结果将是:

A   B1   B2   B3
=== ==== ==== ====
M   2    3    5
N   2    5    null
O   6    null null
P   3    7    9
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直在尝试用TOP,GROUP BY,PIVOT创建查询.我认为最好的方法是使用PIVOT,但由于我没有值,我可以用作列名,我被卡住了.此外,对这些值进行前3选择似乎也非常具有挑战性.

*编辑*

它们是A列和B列的唯一约束,因此B的值对于相同的A始终是唯一的.

Tar*_*ryn 7

你可以使用PIVOT函数来获得结果,但我也会实现类似于row_number()获得最终结果的窗口函数.如果在列上对数据进行分区,该row_number()函数将为每个B值创建唯一的序列号A.此序列号将用作新列名:

select a, B1, B2, B3
from
(
  select a, b,
    row_number() over(partition by a
                      order by b) seq
  from yourtable
) d
pivot
(
  max(b)
  for seq in ('1' as B1, '2' as B2, '3' as B3)
) piv;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.这将得到一个结果:

| A | B1 |     B2 |     B3 |
|---|----|--------|--------|
| M |  2 |      3 |      5 |
| N |  2 |      5 | (null) |
| O |  6 | (null) | (null) |
| P |  3 |      7 |      9 |
Run Code Online (Sandbox Code Playgroud)