Mysql-запрос для выбора равных сегментов на основе количества различных записей с учетом ограничения на общее количество записей - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующее требование.

Как выбрать одинаковые сегменты (или почти одинаковые), исходя из отношения общего / количества различных записей. Пример: если данные в таблице

10 u1 
11 u1
12 u2
13 u2
14 u2
15 u3
16 u3
17 u3
18 u3
19 u3
20 u4
21 u4
22 u4
23 u4
24 u4
25 u4
26 u4
27 u4
28 u4
29 u4

теперь во втором столбце есть 4 различных значения, и если я хочу выбрать 20 строк, результат должен /, может выглядеть как

10 u1 
11 u1
12 u2
13 u2
14 u2
15 u3
16 u3
17 u3
18 u3
19 u3
20 u4
21 u4
22 u4
23 u4
24 u4

У u1 и u2 нет 5 (20/4) записей, поэтому возвращаются только доступные может кто-нибудь помочь?

1 Ответ

0 голосов
/ 13 ноября 2018

Вот решение "старой школы" ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,u INT NOT NULL
);

INSERT INTO my_table VALUES
(10,1),
(11,1),
(12,2),
(13,2),
(14,2),
(15,3),
(16,3),
(17,3),
(18,3),
(19,3),
(20,4),
(21,4),
(22,4),
(23,4),
(24,4),
(25,4),
(26,4),
(27,4),
(28,4),
(29,4);

SELECT id
     , u 
  FROM  
     ( SELECT x.*
            , COUNT(*) running 
         FROM my_table x 
         JOIN my_table y 
           ON y.u = x.u 
          AND y.id <= x.id 
        GROUP 
           BY x.id 
        ORDER 
           BY running
            , u 
        LIMIT 15
     ) a
 ORDER 
    BY id;
+----+---+
| id | u |
+----+---+
| 10 | 1 |
| 11 | 1 |
| 12 | 2 |
| 13 | 2 |
| 14 | 2 |
| 15 | 3 |
| 16 | 3 |
| 17 | 3 |
| 18 | 3 |
| 19 | 3 |
| 20 | 4 |
| 21 | 4 |
| 22 | 4 |
| 23 | 4 |
| 24 | 4 |
+----+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...