我不确定如何称呼我想要实现的目标,因此很难在SO上找到答案。所以我决定发布我自己的,希望有人会给它正确的命名。
我在表foo
上有以下值:
id | myvalue
-------------------
98ff5ab | 501
fa69ac0 | 502
66afb6a | 501
988af2b | 503
12a3f4b | 503
81cde8a | 502
788bf2b | 502
55b3f4b | 503
90ade8a | 502
我的目标是实现某种ORDER BY
,我会myvalue
重复:{/ p>
id | myvalue
-------------------
98ff5ab | 501
fa69ac0 | 502
988af2b | 503
66afb6a | 501
81cde8a | 502
12a3f4b | 503
788bf2b | 502
55b3f4b | 503
90ade8a | 502
所以我将字段myvalue
排序为顺序组,重复方式为501,502,503; 501,502,503; 502,503; 502
。
我怎么能实现这个目标?
答案 0 :(得分:2)
您可以在ROW_NUMBER上订购,为每个myValue
提供一个位置:
CREATE TABLE o (
id serial,
v int
);
INSERT INTO o(v) VALUES (1), (1), (1), (2), (2), (2), (3), (3), (3);
SELECT id, v, r -- you probably don't want to SELECT r here, simply here to show its value
FROM (
SELECT id, v, ROW_NUMBER() OVER (PARTITION BY v) r
FROM o
) s
ORDER BY r, v
;
┌────┬───┬───┐
│ id │ v │ r │
├────┼───┼───┤
│ 1 │ 1 │ 1 │
│ 4 │ 2 │ 1 │
│ 7 │ 3 │ 1 │
│ 2 │ 1 │ 2 │
│ 5 │ 2 │ 2 │
│ 8 │ 3 │ 2 │
│ 3 │ 1 │ 3 │
│ 6 │ 2 │ 3 │
│ 9 │ 3 │ 3 │
└────┴───┴───┘
(9 rows)
答案 1 :(得分:1)
这应该可以解决问题:
select id, myvalue from (
select *, row_number() over(partition by myvalue order by myvalue) [order] from #temp )a
order by [order], myvalue
答案 2 :(得分:1)
您可以使用row_number()
对结果进行排序:
select id, myvalue
from (select *, row_number() over (partition by myvalue order by myvalue) seq
from table t
) t
order by seq, myvalue;
答案 3 :(得分:1)
不需要子查询:
select t.*
from t
order by row_number() over (partition by myvalue order by null), myvalue;