PostgreSQL - 如何通过重复的相同字段值排序

时间:2018-06-15 15:37:05

标签: sql postgresql

我不确定如何称呼我想要实现的目标,因此很难在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

我怎么能实现这个目标?

4 个答案:

答案 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;