SQL выбирает строки с номером в последовательности - PullRequest
0 голосов
/ 24 июня 2018

У меня есть таблица 1: N, где каждый объект может иметь несколько номеров.

ID  Number
1  10
1  13
1  11
1  12
1  16
2  11
2  12
2  13
2  10

Теперь я хочу, чтобы все идентификаторы имели, например, 3 числа в порядке возрастания. Я не указываю, какие числа я хочу, я просто хочу, чтобы SQL возвращал мне все возможные комбинации, которые он может найти, но числа должны быть в порядке возрастания, и последовательность должна содержать ровно 3 числа . Числа всегда являются целыми числами любого значения. Числа в результате должны быть рядом друг с другом (12,13,16) является недопустимым результатом.

Для 3 чисел в этом примере это будет:
ID 1: (10,11,12), (11,12,13) ​​
ID 2: (11,12,13), (10,11,13)

Для 2 чисел в этом примере это будет:
ID 1: (10,11), (11,12), (12,13) ​​
ID 2: (11,12) (12,13) ​​

Возможно ли это в SQL select? Thanx

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Просто используйте join. Это создает набор результатов с каждым примером последовательных чисел в другой строке:

select id, t1.number, t2.number, t3.number
from t t1 join
     t t2
     on t2.id = t1.id and t2.number = t1.number + 1 join
     t t3
     on t3.id = t2.id and t3.number = t2.number + 1;

Если бы вы действительно хотели список, вы бы просто сделали:

select id,
       group_concat('(', t1.number, ',', t2.number, ',', t3.number, ')') as groups
from t t1 join
     t t2
     on t2.id = t1.id and t2.number = t1.number + 1 join
     t t3
     on t3.id = t2.id and t3.number = t2.number + 1
group by t1.id;
0 голосов
/ 24 июня 2018

Решение, близкое к ожидаемому.Вовлекает использование внутреннего объединения с внутренними объединениями с CONCAT_WS, GROUP_CONCAT ..

Для группы из трех вы используете этот запрос

Запрос

SET SESSION group_concat_max_len = @@max_allowed_packet

SELECT 
   records.ID
 , GROUP_CONCAT(CONCAT('(', records.number, ')'))
FROM ( 

  SELECT 
   DISTINCT 
       table11.ID
     , CONCAT_WS(
         ','
       , table11.Number
       , table12.Number
       , table13.Number
     ) AS number 
  FROM 
   Table1 AS table11

  INNER JOIN 
   Table1 AS table12
  ON
   table11.Number + 1 = table12.Number

  INNER JOIN 
    Table1 table13
  ON
   table12.Number + 1 = table13.Number

  ORDER BY
    table11.ID ASC
  , table11.Number ASC

) AS records 

GROUP BY 
 records.ID

Результат

| ID | GROUP_CONCAT(CONCAT('(', records.number, ')')) |
|----|------------------------------------------------|
|  1 |                          (11,12,13),(10,11,12) |
|  2 |                          (11,12,13),(10,11,12) |

см. Демонстрацию http://sqlfiddle.com/#!9/c5dfce/39

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