【发布时间】:2021-08-20 16:00:53
【问题描述】:
我有一个查询,它在一列中返回第 n 行。我想将这些行分成两半并放在另一列中。
| ITEM |
|---|
| A1 |
| A2 |
| A1 |
| A3 |
| A4 |
| A5 |
| A6 |
| A7 |
| A8 |
| A9 |
| A10 |
| A11 |
转换为
| Col 1 | Col 2 |
|---|---|
| A1 | A2 |
| A3 | A4 |
| A5 | A6 |
| A7 | A8 |
| A9 | A10 |
| A11 |
【问题讨论】:
-
PIVOT 不是获得所需内容的正确选择,因为 PIVOT 聚合(总和,平均)会导致标题下方的单元格。
我有一个查询,它在一列中返回第 n 行。我想将这些行分成两半并放在另一列中。
| ITEM |
|---|
| A1 |
| A2 |
| A1 |
| A3 |
| A4 |
| A5 |
| A6 |
| A7 |
| A8 |
| A9 |
| A10 |
| A11 |
转换为
| Col 1 | Col 2 |
|---|---|
| A1 | A2 |
| A3 | A4 |
| A5 | A6 |
| A7 | A8 |
| A9 | A10 |
| A11 |
【问题讨论】:
你可以这样做:
SELECT a.col1, b.col1
FROM (select col1,row_number() over(order by col1) rownum from Test) a
LEFT JOIN (Select col1, lag(col1) over(order by col1) previous from test) b
ON a.col1 = b.previous
WHERE rownum%2=1
作为测试表和列,这基本上是选择奇数行并将它们与下一行连接起来。
【讨论】:
您似乎还想删除重复项。所以,我建议使用dense_rank() 进行聚合:
select max(case when seqnum % 2 = 1 then col1 end),
max(case when seqnum % 2 = 0 then col1 end)
from (select col1,
dense_rank() over (order by col1) as seqnum
from test
) t
group by ceiling(seqnum / 2.0);
注意:这里假定排序基于col1 值。
【讨论】:
2.0 更改为n 并在SELECT 中添加额外的max() 表达式。