从SQL结果中创建成对行而不重复值,仅使用SQL

时间:2016-02-17 17:46:06

标签: sql

由于误读了一个问题,我偶然发现了一些我无法做到的事情。我有一张名字表:

Name
A
B
C
D
E
F

我想将它们输出为:

A B
C D
E F

我无法在SQL中找到这样做,即使它在SQL之外也是微不足道的。这可能吗?

2 个答案:

答案 0 :(得分:0)

这样做的规范方法是使用row_number()。让我假设排序不重要或者您有一些指定排序的列,我将调用id。 SQL表表示无序集,因此表中没有排序;只有列表示的排序。

一种典型的方法是:

select max(case when seqnum % 2 = 0 then name end) as name1,
       max(case when seqnum % 2 = 1 then name end) as name2
from (select name, row_number() over (order by id) - 1 as seqnum
      from t
     ) t
group by floor(seqnum / 2);

请注意,某些数据库使用mod()函数而不是%来计算余数。

答案 1 :(得分:0)

与戈登相似。如您所见,有多种方法:

with data as (
    select Name, row_number() over (order by Name) - 1 as seq /* start at zero */
    from T
)
select d1.Name, d2.Name
from
    data d1 left outer join data d2 on d2.seq = d1.seq + 1
where
    d1.rn % 2 = 0

Gordon的方法的一个优点是,您可以轻松地更改为两列而不涉及额外的连接。