我想从表中查询两列,以便将两列中的值随机排序。以随机顺序返回行是不够的。位于同一行的不同列中的值最初需要以随机不同的行结束。如果没有一步到位的方法可以做到这一点,那么我需要找出一些间接方法来获得这种效果。提前感谢您的任何建议!
一种(繁琐的(方法是使用带有row_number
、cross apply
和newid
的 cte。
这里的关键点是在每个列的随机值上使用row_number,然后使用该row_number将列连接在一起。必须使用交叉应用,以便为每一行调用正如狗仔队的回答所表明的那样,在这种情况下不需要交叉申请。newId()
函数。
创建并填充示例表(请在以后的问题中保存此步骤(:
DECLARE @T AS TABLE
(
c1 int,
c2 int
)
INSERT INTO @T VALUES
(1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), (9,9), (10,10)
反恐委员会:
;with cte as
(
SELECT c1,
ROW_NUMBER() OVER(ORDER BY c1Order) as RNc1,
c2,
ROW_NUMBER() OVER(ORDER BY c2Order) as RNc2
FROM @T
CROSS APPLY
(
SELECT NEWID() as c1Order,
NEWID() as c2Order
) randomSorter
)
查询:
SELECT t0.c1, t1.c2
FROM cte as t0
INNER JOIN cte as t1 ON t0.RNc1 = t1.RNc2
ORDER BY t0.RNc1
结果样本:
c1 c2
1 8
10 6
2 9
9 3
6 1
3 7
5 5
4 2
8 4
7 10
您可以在rextester上看到现场演示。
只是佐哈尔
的答案把支票交给佐哈尔
DECLARE @T AS TABLE (iden int identity,c1 int, c2 int);
INSERT INTO @T VALUES
(1,3), (2,2), (2,3), (4,4), (5,5), (6,7), (6,7), (8,8), (9,9), (10,10);
select *
from @t
order by iden;
with cte as
( SELECT c1, ROW_NUMBER() OVER(ORDER BY NEWID()) as RNc1,
c2, ROW_NUMBER() OVER(ORDER BY NEWID()) as RNc2
FROM @T
)
select cte1.c1, cte2.c2
from cte cte1
join cte cte2
on cte1.RNc1 = cte2.RNc2
order by cte1.RNc1;