Создать случайное значение в том же шаблоне, что и существующее поле идентификатора - PullRequest
0 голосов
/ 24 апреля 2020

Следующий запрос:

SELECT id, var1, var2, var3 FROM my_table

возвращает этот результат:

+----------+------+------+------+
| id       | var1 | var2 | var3 |
+----------+------+------+------+
| 43245324 | A    | 1    | 2    |
+----------+------+------+------+
| 43245324 | B    | 2    | 3    |
+----------+------+------+------+
| 11112233 | A    | 2    | 2    |
+----------+------+------+------+
| 11112233 | A    | 2    | 2    |
+----------+------+------+------+
| 11112233 | C    | 3    | 3    |
+----------+------+------+------+
| 23312222 | H    | 5    | 1    |
+----------+------+------+------+
| 23312222 | Q    | 3    | 3    |
+----------+------+------+------+

Мне нужно новое поле идентификатора, которое может быть случайным, но должно соответствовать существующему Я бы. Например, каждый экземпляр 43245324 должен иметь один и тот же соответствующий newID. Как бы я скорректировал свой запрос, чтобы он возвращал результат с чем-то вроде:

+----------+-------+------+------+------+
| id       | newid | var1 | var2 | var3 |
+----------+-------+------+------+------+
| 43245324 | 1     | A    | 1    | 2    |
+----------+-------+------+------+------+
| 43245324 | 1     | B    | 2    | 3    |
+----------+-------+------+------+------+
| 11112233 | 2     | A    | 2    | 2    |
+----------+-------+------+------+------+
| 11112233 | 2     | A    | 2    | 2    |
+----------+-------+------+------+------+
| 11112233 | 2     | C    | 3    | 3    |
+----------+-------+------+------+------+
| 23312222 | 3     | H    | 5    | 1    |
+----------+-------+------+------+------+
| 23312222 | 3     | Q    | 3    | 3    |
+----------+-------+------+------+------+

1 Ответ

1 голос
/ 24 апреля 2020

Просто используйте dense_rank():

select t.*, dense_rank() over (order by id) as newid
from mytable t;

Это присвоит значение, начинающееся с 1 без пробелов, на основе порядка id.

Кстати, если вам нужно «случайное» значение, вы можете использовать rand() с начальным числом:

select t.*, dense_rank() over (order by rand(id), id) as newid
from mytable t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...