sql - 如何为给定的一组行创建某种迭代器(或人工 ID)?

标签 sql postgresql iterator counter

抱歉这个愚蠢的标题,但我只是不知道如何调用它。

这就是我想要的。查看以下查询:

SELECT *
FROM (
  SELECT xyz
)
JOIN ...
ORDER BY RANDOM()

我想知道查询结束时 xyz 行的初始顺序。所以我想到了这样的事情(伪SQL):

iterator = 1;
SELECT *
FROM (
  SELECT iterator++, xyz
)
JOIN ...
ORDER BY RANDOM()

所以之后我的结果集将如下所示:

iterator | some other data
--------------------------
5        | ...
1        | ...
6        | ...
8        | ...
4        | ...
2        | ...
7        | ...
3        | ...

因此之后可以重新创建原始订单。

现在您可能会说:为什么不在选择 xyz 的地方简单地使用 id?很简单:没有 idxyz 数据是用户输入,我想在查询中为它创建一个人工 id

谢谢。

最佳答案

您应该能够使用 row_number() (这是一个 windowing function )来分配您想要的“迭代器”。这将为每一行创建一个序列号:

select *
from
(
  select col,
     row_number() over(order by col) rn
  from yourtable
) src
order by random()

参见 SQL Fiddle with Demo

关于sql - 如何为给定的一组行创建某种迭代器(或人工 ID)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126254/

相关文章:

c++ - QComboBox 数组访问

c++ - Iterator循环会多次调用end()吗?

sql - 任何通过 SQL 实现 ACL 的好例子/引用资料?

sql - 将两个 SELECT 查询合并为一个

mysql - 删除指定了外键的表

SQL查询以从具有二维数据的表中获取邻居

django - 如何在 Dockerized Django 中运行迁移?

php - 是否可以将 Doctrine2 批处理与 Twig 的 for 标签无缝使用?

mysql - 从单个表中选择统计数据

java - 如何多线程更新由sql代码更新的数据库?