Упорядочение строк для равномерного распределения общих записей - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица со следующими данными:

+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  1 | alice | usa     |
|  2 | bob   | usa     |
|  3 | chad  | russia  |
|  4 | derek | china   |
|  5 | ethan | usa     |
+----+-------+---------+

Есть ли в sql способ переупорядочить мою таблицу [кроме ORDER BY RAND ()], который позволил бы мне отображать записи таким образом, чтобы каждая последующая строка показывала уникальную страну. т.е. если в предыдущей строке также указана страна 'сша', покажите запись с другой страной как можно дольше.

В приведенном выше случае один из возможных выходных данных может быть:

+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  1 | alice | usa     |
|  3 | chad  | russia  |
|  2 | bob   | usa     |
|  4 | derek | China   |
|  5 | ethan | usa     |
+----+-------+---------+

Я в основном пытаюсь распределить строки, чтобы они выглядели более разложенными в тех случаях, когда большинство записей имеют общее доминирующее значение.

1 Ответ

0 голосов
/ 09 января 2019

Немного придумано, возможно ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL UNIQUE
,country VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'alice','usa'),
(2,'bob','usa'),
(3,'chad','russia'),
(4,'derek','china'),
(5,'ethan','usa'),
(6,'fred','usa');

SELECT id,name,country FROM (SELECT *, @i:=@i+1 i FROM my_table,(SELECT @i:=0) vars ORDER BY country = 'usa') a ORDER BY MOD(i,4), id;
+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  2 | bob   | usa     |
|  3 | chad  | russia  |
|  5 | ethan | usa     |
|  4 | derek | china   |
|  6 | fred  | usa     |
|  1 | alice | usa     |
+----+-------+---------+
6 rows in set (0.00 sec)

Просматривая комментарии, кажется, что вы действительно ищете что-то вроде этого ...

SELECT x.* 
  FROM my_table x 
  JOIN my_table y 
    ON y.country = x.country 
   AND y.id <= x.id 
 GROUP 
    BY x.id 
 ORDER 
    BY COUNT(*), country;
+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  4 | derek | china   |
|  3 | chad  | russia  |
|  1 | alice | usa     |
|  2 | bob   | usa     |
|  5 | ethan | usa     |
|  6 | fred  | usa     |
+----+-------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...