如何编写SQL查询,将特定结果放在PostgreSQL中的第n个位置

如何编写SQL查询,将特定结果放在PostgreSQL中的第n个位置,sql,postgresql,Sql,Postgresql,让我们想象一下,我有一张产品表,如下所示: id | product_name 1 | Product 1 2 | Product 2 3 | Product 3 4 | Product 4 5 | Product 5 6 | Product 6 ... 1 | Product 1 2 | Product 2 5 | Product 5 3 | Product 3 4 | Product 4 6 | Product 6 是否可以选择所有这些记录,但是,例如,我希望产品5显示在结果集中的第三个

让我们想象一下,我有一张产品表,如下所示:

id | product_name
1 | Product 1
2 | Product 2
3 | Product 3
4 | Product 4
5 | Product 5
6 | Product 6
...
1 | Product 1
2 | Product 2
5 | Product 5
3 | Product 3
4 | Product 4
6 | Product 6
是否可以选择所有这些记录,但是,例如,我希望产品5显示在结果集中的第三个位置,使其看起来像这样:

id | product_name
1 | Product 1
2 | Product 2
3 | Product 3
4 | Product 4
5 | Product 5
6 | Product 6
...
1 | Product 1
2 | Product 2
5 | Product 5
3 | Product 3
4 | Product 4
6 | Product 6
编辑:添加真实问题解释

我问这个问题是因为我有一个很大的产品表(100000+条记录),我需要进行查询,使少数特定产品(其中3个具有ID X、Y、Z)显示在结果集的每4个位置,以便最终结果如下所示:

1 | Product 1
2 | Product 2
3 | Product 3
X | Product X
4 | Product 4
5 | Product 5
6 | Product 6
Y | Product Y
7 | Product 7
8 | Product 8
9 | Product 9
Z | Product Z
10 | Product 10
...

您可以使用窗口函数来实现这一点。其思想是为每组行添加一个“分组”。对于您关心的ID,这只是
row\u number()
。其余的需要算术

您可以在
order by
子句中执行所有这些操作:

order by (case when id in (x, y, z)
               then row_number() over (partition by (id in (x, y, z)) order by id)
               else ceiling(row_number() over (partition by (id in (x, y, z)) order by id) / 3.0)
          end),
         (id in (x, y, z)), id

请注意,其余id的组大小为3(其中有3个,然后是一个特殊id)。第二个
order by
键将特殊id放在每个组的末尾。

当product_name='product 5'然后2.5 ELSE id end时按大小写排序
是的,如果您希望微观管理
order by
,可以根据非常具体的标准指定订单。如果没有更多的信息,很难说这个方法有多复杂/可靠。是的,简化的问题很容易解决。请编辑您的问题以显示更复杂的问题issue@ysth添加了带有真实问题描述的编辑,效果非常好,非常感谢:)