Как разбить таблицу на SQL без разрезания на определенный столбец - PullRequest
0 голосов
/ 03 ноября 2018

Представьте себе данные этой таблицы, упорядоченные по названию страны:

CustomerID  Country
12          Argentina
54          Argentina
20          Austria
59          Austria
50          Belgium
76          Belgium
77          Belgium
15          Brazil
21          Brazil
31          Brazil
34          Brazil
88          Brazil
10          Canada
42          Canada
51          Canada
73          Denmark
74          France
84          France
85          France
1           Germany
6           Germany
17          Germany
37          Ireland
27          Italy
49          Italy
66          Italy
2           Mexico
3           Mexico

Как я могу разбить его на страницы не более чем на 10 (есть исключения), не возвращая при этом страницы, вырезанные в середине групп стран. Вот ожидаемый результат

переменная со страницей = 1 возвращает

12          Argentina
54          Argentina
20          Austria
59          Austria
50          Belgium
76          Belgium
77          Belgium

переменная с page = 2 возвращает

15          Brazil
21          Brazil
31          Brazil
34          Brazil
88          Brazil
10          Canada
42          Canada
51          Canada
73          Denmark

переменная со страницей = 3 возвращает

74          France
84          France
85          France
1           Germany
6           Germany
17          Germany
37          Ireland

переменная со страницей = 4 возвращает

27          Italy
49          Italy
66          Italy
2           Mexico
3           Mexico

Исключением является ограничение в 10, если в одной и той же стране более 10 строк.

Я попробовал пару вещей с ограничением и смещением, но все еще не нашел ни одного простого / чистого запроса Я делаю это для чанкинга. Буду признателен за любую оказанную помощь. Вы можете поиграть с данными ЗДЕСЬ!

1 Ответ

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

Вы можете сделать это в MySQL, используя переменные. Это довольно сложно, потому что вам нужно отслеживать страницу и номер строки на странице. Но MySQL действительно поддерживает только одно выражение для каждой переменной. В частности, он не гарантирует порядок вычисления выражений в SELECT.

Логика заключается в том, чтобы добавить новый столбец для страницы, который можно использовать для нумерации страниц. Логика примерно такая:

select t.*,
       @p := (case when @c = country
                   then (case when @rn = 10  -- a county has more than 10 rows
                              then (case when (@rn := 1) = null then null -- never happens
                                         else (@p := @p + 1) 
                                    end)
                              else (case when (@rn := @rn + 1) = null then null -- never happens
                                         else @p
                                    end)
                         end)
                    when (@rn + cnt > 10)  -- start a new page
                    then (case when (@rn := 1) = null then null -- never happens
                               else (@p := @p + 1)
                          end)
                    else (case when (@rn := @rn + 1) = null then null -- never happens
                               else @p
                          end)
             end) as page
from (select t.*, c.cnt
      from t join
           (select country, count(*) as cnt
            from t
            group by country
           ) c
           on t.country = c.country
      order by t.country, t.CustomerID
    ) t cross join
    (select @rn := 0, @p := 0, @c := '') params
order by page, t.country, t.CustomerId;

Здесь - это скрипта db <>, которая показывает работающий код (по крайней мере, в некоторых случаях).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...