MySQL: добавить ГДЕ в левое соединение - PullRequest
1 голос
/ 18 февраля 2020

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

enter image description here

SequenceNumber всегда кратен 10. Я хотел бы получить для конкретного c cpId, наименьший свободный порядковый номер (все еще кратный 10). Например, для cpId = 1 наименьшее доступное значение должно быть 20. Для cpId = 2 это должно быть 10.

У меня есть следующий оператор, чтобы получить наименьший доступный sequenceNumber для всех cpId, и я не знаю, как я могу добавить WHERE cpId = x внутри оператора :

SELECT MIN(t1.sequenceNumber + 10) AS nextID
FROM LogicalConnection t1
   LEFT JOIN LogicalConnection t2
       ON t1.sequenceNumber + 10 = t2.sequenceNumber
WHERE t2.sequenceNumber IS NULL;

Скрипт БД: https://www.db-fiddle.com/f/ag67AkFzfwPZEva8bTN7Q3/2# & Togetherjs = L9nHb3Uu7O

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы должны объединить обе таблицы в столбце cpId и сгруппировать строки с одинаковым cpId. Где можно использовать для фильтрации строк. Приведенный ниже запрос дает вам cpId и соответствующий ему следующий доступный минимальный порядковый номер.

SELECT t1.cpId, MIN(t1.sequenceNumber + 10) AS nextID
FROM LogicalConnection t1
LEFT JOIN LogicalConnection t2
       ON t1.sequenceNumber + 10 = t2.sequenceNumber
       and t1.cpId = t2.cpId
group by (t1.cpId)
1 голос
/ 18 февраля 2020

Вы можете использовать lead(), чтобы получить следующий номер, а затем несколько простых логик c:

select cpid,
       (case when min_sn > 10 then 10
             else min(sequenceNumber) + 10
        end)
from (select t.*,
             min(sequenceNumber) over (partition by cpid) as min_sn,
             lead(sequenceNumber) over (partition by cpid order by sequenceNumber) as next_sn
      from t
     ) t
where next_sn is null or next_sn <> sequenceNumber + 10
group by cpid, min_sn;
...