На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Задача по SQL , Не могу решить вроде не сложную задачу
    Доброго времени суток.

    Встретилась задача :

    Схема данных:
    Станции station (station_id, station_name)
    Поезда (train_id, train_code)
    Расписание (station_id, train_id, arrive_time, departure_time)

    Считаем, что поезда ходят каждый день по одному и тому же расписанию. Время прибытия и отправления указано с точностью до минуты.
    Нужно найти станцию, на которой одновременно находится максимальное количество поездов.

    Она не элементарная, но, наверное и не такая сложная. Я понимаю что нужно для каждой станции посчитать максимальное количество поездов у которых промежуток пребывания пересекается, потом взять станцию с наибольшим показателем. Но с какой стороны подступиться даже не знаю.

    Буду признателен за помощь.
      Цитата Nikolaiko @
      с какой стороны подступиться даже не знаю

      В подзапросе соберите в единый набор все arrive_time и departure_time. После чего привяжите к этим временам копию исходной таблицы по попаданию времени в диапазон, сгруппируйте по времени и станции, посчитайте количество и возьмите первую запись.
        Akina, спасибо за ответ.
        Я попробовал так :
        ExpandedWrap disabled
          SELECT  copyTable.station_id, copyTable.arrival_time, copyTable.departure_time, COUNT(*)
          FROM
          (
              SELECT public.schedule.arrival_time, public.schedule.departure_time
              FROM public.schedule
          ) times
          JOIN
          (
              SELECT *
              FROM public.schedule
          ) copyTable
          ON
          (
              copyTable.arrival_time < times.departure_time AND
              (
                  copyTable.departure_time is NULL OR copyTable.departure_time > times.arrival_time
              )  
          )
          GROUP BY copyTable.station_id, copyTable.arrival_time, copyTable.departure_time
          ORDER BY COUNT

        Но там в количестве какое-то неимоверное число приходит, там стольких отметок в принципе нет на станции.
          Цитата Nikolaiko @
          Я попробовал так

          Какое отношение эта, с позволения сказать, попытка, имеет к предложенной мной реализации?

          Цитата Akina @
          В подзапросе соберите в единый набор все arrive_time и departure_time

          ExpandedWrap disabled
            SELECT arrival_time AS time_point FROM public.schedule
            UNION
            SELECT departure_time FROM public.schedule
            Прошу прощения, я плохо знаю SQL поэтому неверно понял ваше предложение.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0268 ]   [ 15 queries used ]   [ Generated: 29.03.24, 06:25 GMT ]