我使用SQL-Server 2008并遇到此问题,最好通过示例解释:
我们说我有这个号码3776.我想订购我的结果清单如下:
3775
3777
3774
3778
3773
3779
...
换句话说,基于3776在两个方向上尽可能接近,加上AND减去。
E.g。这只会给我正面的顺序:
where FIELDNAME > 3776
order by FIELDNAME asc
如何获得所需的结果?
答案 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)