我有一个表a:
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语句来选择圆上标记?这意味着我需要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
你可以这样做:
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也是如此。此外,您可以在子查询中使用它,以便也选择"舍入"。您刚刚在结果集中创建了。为了确保它也被single_tag排序,您可以在主查询的末尾添加它。
你可以试试:
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;