Select 轮次排序 table?

Select order by round table?

我有一个 table 像这样的:

WcsID   Single_long, Single_short, Single_tag
1001    100          100           A
1002    100          100           A
1003    100          100           A
1004    100          100           B
1005    100          100           B
1006    100          100           B
1007    100          100           C
1008    100          100           C

标签上是否有 SQL 轮到 select 的好的语句?这意味着我需要 A-B-C 作为一轮,在上面的例子中有 3 轮。我需要先按回合排序,然后是该回合的WcsID,结果应该是这样的:

-- round 1
1001        A
1004        B
1007        C
-- round 2
1002        A
1005        B
1008        C
-- round 3
1003        A
1006        B

你可以试试这个:

CREATE TABLE test(col1 int, col2 varchar(10), col3 varchar(10), col4 varchar(10));
INSERT INTO test(col1, col2, col3, col4)
VALUES (1001, 100, 100, 'A'),(1002, 100, 100, 'A'),(1003, 100, 100, 'A'),(1004, 100, 100, 'B'),(1005, 100, 100, 'B'),(1006, 100, 100, 'B'),(1007, 100, 100, 'C'),(1008, 100, 100, 'C');

SELECT *
FROM (
    SELECT col1, col2, col3, col4
        , RANK() OVER (PARTITION BY Col4 ORDER BY Col1 ) rank 
    FROM test
) A
ORDER BY rank;

你可以这样做:

SELECT sorted.wcsID, sorted.single_tag,
       sorted.sort AS currentRound
FROM (
    SELECT wcsID, single_tag, 
        RANK() OVER (PARTITION BY single_tag ORDER BY wcsID) AS sort
    FROM a
) AS sorted
ORDER BY sorted.sort, sorted.single_tag;

RANK 函数在您的情况下非常适合此类排序,因为它既可以按您命名的“round”排序,也可以按 wcsID 排序。此外,您可以在子查询中使用它,以便 select 您刚刚在结果集中创建的“回合”。为确保它也按 single_tag 排序,您可以将它添加到主查询的末尾。