Как создать условную функцию MySQL, которая перебирает таблицу и принимает несколько параметров - PullRequest
0 голосов
/ 27 апреля 2018

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

Сначала сгруппируйте по разным used_car_ids, затем обновите столбец на основе .....

  1. Если столбец used_car_id равен new_car_id, а параметры drive_mode и saftey_rating равны 1 , тогда установите номер Parking_Spot равным 1 как наивысший приоритет.
  2. Если столбец used_car_id равен new_car_id, но параметр drive_mode равен 1 , а saftey_rating равен 2, то установите для столбца Parking_Spot значение 2 или доступный последовательный номер Parking_Spot

    • Если есть больше условий, похожих на это, но отличается только saftey_rating, я хотел бы продолжать увеличивать номер Parking_Spot до следующего доступного последовательного номера Parking_spot для этой записи
  3. Если столбец used_car_id равен new_car_id, но параметр drive_mode равен 2 , а saftey_rating равен 1, то установите для столбца Parking_Spot значение 3 или следующий доступный номер Parking_Spot

  4. Если столбец used_car_id равен new_car_id, но параметр drive_mode равен 2 , а saftey_rating равен 2, то установите для номера Parking_Spot значение 4 или следующий доступный номер Parking_Spot
    • Применяются те же правила, что и выше.

Если прецедент с наивысшим приоритетом не встречается, он должен рассматривать вариант использования 2 как наивысший и указывать его как Parking_Spot = 1 .

Это небольшая картина того, что я бы идеально хотел. Таким образом, как вы можете видеть на рисунке, номер парковочного места равен 1 и 2, в зависимости от того, являются ли used_car_id, new_car_id, drive_mode и safety_rating равными 1 и 2, но как только используются used_car_id и new_car_id, номер парковочного места увеличивается до 3 и 4 .

Used Car Dealer Table

Я предполагаю, что мне нужна функция для ввода 4 параметров, и на основе этих полей я возвращаю число в качестве парковочного места. Но я все еще немного не уверен, как это сделать. Любая помощь будет оценена. Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2018

Из ваших тегов не ясно, используете ли вы базу данных Oracle или MySQL. Этот ответ предполагает первый.

В вашем вопросе есть несколько пробелов, но кажется, что вы хотите присвоить каждой строке порядковый номер, основанный на drive_mode и safety_rating. Вы упоминаете "used_car_id column is equal to the new_car_id" несколько раз, но никогда не упоминаете, что хотите делать, когда они не равны.

Для написанного вопроса кажется, что это может быть решено довольно простым способом с использованием аналитических функций. В этом случае мы просто скажем функции упорядочить строки по drive_mode_id и safety_rating и присвоим каждой строке в результирующем порядке последовательный номер:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER () OVER (ORDER BY drive_mode, safety_rating)
           AS parking_spot
FROM   your_table
WHERE  used_car_id = new_car_id

Похоже, что MySQL поддерживает аналитические функции (так называемые оконные функции) начиная с 8.0.2, поэтому приведенное выше решение должно работать, если вы используете эту версию или более позднюю (если нет, этот ответ может помочь ).

Чтобы обновить это, чтобы рассматривать used_car_id = new_car_id как условие сортировки, вам нужно добавить условие в ORDER BY:

SELECT id,
       used_car_id,
       new_car_id,
       car_features_id,
       drive_mode_id,
       safety_rating,
       ROW_NUMBER ()
       OVER (
           ORDER BY
               CASE WHEN used_car_id = new_car_id THEN 1 ELSE 2 END,
               drive_mode,
               safety_rating)
           AS parking_spot
FROM   your_table

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

...