根据列值对SQL表进行部分排序

时间:2016-06-21 10:11:09

标签: sql sorting shuffle

假设我有一个如下所示的表:

product, color
1, 1
2, 1
3, 1
4, 2
5, 2
6, 2
7, 3
8, 3

是否可以重新排列表格,以便按颜色重新排列产品?例如,在这种情况下答案是:

product, color
1, 1
4, 2
7, 3
2, 1
5, 2
8, 3
2, 1
6, 2
3, 1

3 个答案:

答案 0 :(得分:0)

当然,您可以通过NEWID()

订购

让我们制作测试数据;

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
GO
CREATE TABLE #TestData (product int, colour int)
INSERT INTO #TestData (product, colour)
VALUES
(1,1)
,(2,1)
,(3,1)
,(4,2)
,(5,2)
,(6,2)
,(7,3)
,(8,3)

然后对此运行查询;

SELECT 
product
,colour
FROM #TestData
ORDER BY NEWID()

这给出了这样的数据的随机顺序;

product colour
4       2
1       1
5       2
7       3
6       2
3       1
2       1
8       3

编辑:我刚刚看到您似乎想要在颜色列中使用某种模式订购,而不是随机。无论如何,我将把这个答案留作随机结果。

答案 1 :(得分:0)

我会选择一个随机数作为第三列,并按该随机数排序。在伪代码中:

SELECT PRODUCT,
       COLOR,
       RANDOM_NUMBER()
FROM   YOUR_TABLE
ORDER BY 3

随机数的生成取决于您的数据库。在Oracle中,它将是dbms_random.random

您可以通过从表中重新选择来删除随机数:

SELECT PRODUCT,
       COLOR
FROM  (SELECT PRODUCT,
              COLOR,
              RANDOM_NUMBER()
       FROM   YOUR_TABLE
       ORDER BY 3)

答案 2 :(得分:0)

听起来像row_number的工作:

SELECT product, colour, ROW_NUMBER() OVER (PARTITION BY color ORDER BY product)
FROM TABLE
ORDER BY 3, 2