如何从表中获得最高,然后是最低,然后是第二高,然后是第二低值,依此类推

Dar*_* M. 5 sql t-sql sql-server

我有一个问题,我如何获得最高值,然后是最低值,然后是表格中的第二高值.

例如:在表中

Name        Value
----------------------
Apple        2
Pear         3
Pineapple    6
Mango        7
Kiwi         1
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

Name           Value
-----------------------
Mango           7
Kiwi            1
Pineapple       6
Apple           2
Pear            3
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dam*_*ver 10

我假设tsqlt标签本来是tsql,而且这意味着这是针对SQL服务器的:

;with Numbered as (
    select Name,Value,
        ROW_NUMBER() OVER (ORDER BY Value DESC) as rnDesc,
        ROW_NUMBER() OVER (ORDER BY Value ASC) as rnAsc
    from
        @t
), MixedNumbered as (
    select
        Name,Value,
        CASE WHEN rnDesc < rnAsc THEN rnDesc ELSE rnAsc END as rnFin,
        rnAsc,
        rnDesc
    from
        Numbered
)
select Name,Value from MixedNumbered order by rnFin,rnDesc
Run Code Online (Sandbox Code Playgroud)

这是通过查找行号,同时考虑到列表排序均为最高到最低,最低到最高(在Numbered,rnDescrnAsc).然后我们采用在考虑这些排序中的最低行数(MixedNumbered,rnFin).

这应该产生两行rnFin等于1,两行等于2,依此类推; 配对第n个最高行和第n个最低行,直到我们到达集合的中间.

然后我们使用它来对最终结果集进行排序 - 但是使用通过考虑从最高到最低(rnDesc)排序的值获得的位置作为具有相同rnFin值的每对行之间的连接断开器.这意味着,对于每一对,较高值的行将首先出现.

要反转结果(最低,然后是最高,第二低,第二高等),我们只需ORDER BY要将最终子句更改为rnFin,rnAsc.