【问题标题】:Partially sort an SQL table according to column values根据列值对 SQL 表进行部分排序
【发布时间】:2016-06-21 10:11:08
【问题描述】:

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

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

【问题讨论】:

  • 标记使用的 dbms。答案(如果有)可能是特定于产品的。
  • 当您使用“随机播放”一词时,人们会认为您在寻找随机结果。您实际要求的是自定义“排序”。
  • 已修复。很抱歉造成混乱

标签: sql sorting shuffle


【解决方案1】:

当然,您可以通过 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应该是第一个等等......
  • 这是一个基于颜色的重新排列
【解决方案2】:

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

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)

【讨论】:

  • OP 不想要 1、2、3、1、2、3 等吗?
  • OP 谈论洗牌 :-)
  • 是的,我知道,但是 1、2、3、1、2、3 似乎是一个奇怪的随机顺序。
  • 抱歉给您带来了困惑。我需要订购
  • 嗯,请详细说明您的要求。这显然不是简单的按颜色排序。
【解决方案3】:

听起来像是 row_number 的工作:

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

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2020-07-02
    • 2019-02-24
    • 1970-01-01
    • 2022-01-26
    • 2015-01-05
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    相关资源
    最近更新 更多