按特定要求排序结果集

时间:2017-09-22 12:18:19

标签: sql sql-server sql-server-2008 select sql-order-by

我使用SQL-Server 2008并遇到此问题,最好通过示例解释:

我们说我有这个号码3776.我想订购我的结果清单如下:

3775
3777
3774
3778
3773
3779
...

换句话说,基于3776在两个方向上尽可能接近,加上AND减去。

E.g。这只会给我正面的顺序:

where FIELDNAME > 3776
order by FIELDNAME asc

如何获得所需的结果?

4 个答案:

答案 0 :(得分:1)

您可以通过3776与字段值之间的绝对差值来订购查询:

ng-modal

答案 1 :(得分:0)

with t(col) as (
    select 3775 union all 
    select 3777  union all 
    select 3774  union all 
    select 3778  union all 
    select 3773  union all 
    select 3779
    )
 select *  from t
 order by abs(col - 3776), col

答案 2 :(得分:0)

DECLARE @startnum int = 1;
DECLARE @endnum int = 21;
DECLARE @point int = 11;


WITH seq AS 
(
    SELECT @startnum AS num
    UNION ALL
    SELECT num + 1 FROM seq WHERE num + 1 <= @endnum
),
cte AS
(
    SELECT num, abs(@point - num) [shift]
        FROM seq 
)
SELECT num
    FROM cte
    ORDER BY [shift], num;

输出:

num
-----------
11
10
12
9
13
8
14
7
15
6
16
5
17
4
18
3
19
2
20
1
21

答案 3 :(得分:0)

我想你可以用它。我认为order by子句对于获取所有记录的相同序列很重要(您可以决定使用X ASC或X DESC):

    response = iot.publish(
         topic='/sbs/devicedata/flow',
         payload=data
    )

输出:

WITH Y AS (SELECT 3775 AS X UNION ALL SELECT 3776 UNION ALL SELECT 3774 
           UNION ALL SELECT 3773 UNION ALL SELECT 3778 UNION ALL SELECT 3779 
           UNION ALL SELECT 3777)
SELECT X
FROM Y 
WHERE X<>3776
ORDER BY ABS(3776-X), X ASC;

如果您使用

3775
3777
3774
3778
3773
3779

您可以获得以下内容。重要的是要记住,如果您没有指定order by子句,则记录的顺序不是确定性的。因此,如果您只是指定ORDER BY ABS(3776-X),则无法确定是否首先显示更大或更小的数字(与起始编号具有相同的ABS差异)。

WITH Y AS (SELECT 3775 AS X UNION ALL SELECT 3776 UNION ALL SELECT 3774 
           UNION ALL SELECT 3773 UNION ALL SELECT 3778 UNION ALL SELECT 3779 
           UNION ALL SELECT 3777)
SELECT X
FROM Y 
WHERE X<>3776
ORDER BY ABS(3776-X)