Transact-SQL 返回两列,这些列相对于彼此随机排序



我想从表中查询两列,以便将两列中的值随机排序。以随机顺序返回行是不够的。位于同一行的不同列中的值最初需要以随机不同的行结束。如果没有一步到位的方法可以做到这一点,那么我需要找出一些间接方法来获得这种效果。提前感谢您的任何建议!

一种(繁琐的(方法是使用带有row_numbercross applynewid的 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;

最新更新