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

Модераторы: Chow, Bas, MIF
  
> Запрос с условием , Oracle
    Есть набор данных
    Напимер
    1 01,01,2014
    2 02,01,2014
    1 03,01,2014
    4 01,01,2014
    5 01,01,2014
    1 04,01,2014
    2 05,01,2014
    ....

    Надо выбрать все , но если есть 4 и 5 с той же датой то 5 исключить из выборки.
    Сообщение отредактировано: Bas -
      В примере набора данных нет даты.
        Цитата Akina @
        В примере набора данных нет даты.

        представим что они есть.

        Добавлено
        Добавил

        Можно через for
        1,2,3,4,5 - это константы из справочника.
        Сообщение отредактировано: Bas -
          Инами словами, выбрать только первую запись из группы, где группировка выполняется по дате. Верно я понимаю? тогда
          FAQ: Выборка первой/последней записи в группах
            Цитата Akina @
            Инами словами, выбрать только первую запись из группы, где группировка выполняется по дате.

            Нет группировки. Надо выбрать все 1 2 3 4 5, за любую дату но если есть и 4 и 5 одной датой то 5 не включать.
            Результат будет
            1 01,01,2014
            2 02,01,2014
            1 03,01,2014
            4 01,01,2014
            1 04,01,2014
            2 05,01,2014

            PS попробую через exists Найду 4 если есть, потом 5 если есть, если есть одна и вторая с той же датой то по id вторую исключу.
            Сообщение отредактировано: Bas -
              Есть еще вариант, которого нет в том FAQ, по мотивам моего ответа в соседнем топике.
              Можно использовать PARTITION BY. Бегло глянул, Оракл вроде норм это поддерживает.
                Цитата JoeUser @
                Есть еще вариант, которого нет в том FAQ

                Неудивительно, если посмотреть на фамилию раздела, в коем тот FAQ располагается.
                Для Оракла - да, наиболее разумно использовать оконные функции.
                  Скрытый текст
                  Цитата Akina @
                  Неудивительно, если посмотреть на фамилию раздела, в коем тот FAQ располагается.

                  Увы, плотной работы с SQL у меня явно маловато.
                  А что есть - только с PostgreSQL.
                  Посему, как у того чукчи "что вижу - то пою" :P









                    iddatsummcodop
                    101.01.201320 tab
                    201.01.2014200000 nov
                    325.01.201420 tab
                    401.02.20141000 nov
                    515.08.20146000 kap
                    616.08.20146000 kap
                    718.08.20146000 nov

                    надо получить
                    Если операция nov встречается впервые не включать в набор, если это вторая то включить разницу первая-вторая, если третья то разница вторая-третья....



                    [/tr]




                    iddatsummcodop
                    325.01.201420 tab
                    401.02.2014199000 nov
                    515.08.20146000 kap
                    616.08.20146000 kap
                    718.08.2014193000 nov

                    Можно это одним запросом?
                    Сообщение отредактировано: Bas -
                      Цитата Bas @
                      встречается впервые

                      Сортировка, надо понимать, по дате (поле dat)?

                      Цитата Bas @
                      Можно это одним запросом?

                      Конечно.
                      Для начала отбросим из рассмотрения остальные операции, чтобы не мешались под ногами. Ну типа
                      ExpandedWrap disabled
                        SELECT * FROM table WHERE codop NOT IN ('nov')
                        UNION
                        (запрос только для записей с codop = 'nov')


                      Далее возможны несколько вариантов, применимость которых определяется конкретной СУБД.
                      Если это, например, MS SQL или Oracle достаточно свежей версии, то следует использовать оконную аналитику и функцию LAG().
                      Если такой возможности нет - придётся использовать либо две копии таблицы и либо нумерующие техники, либо группировку с отбором минимальной разности дат, и считать требуемую разность.
                        Цитата Akina @
                        Далее возможны несколько вариантов, применимость которых определяется конкретной СУБД.

                        Oracle-10(11). Язык PL/plus (ЦФТ).
                          А чё тогда вопрос в общем разделе?
                          http://docs.oracle.com/cd/B19306_01/server...unctions070.htm
                          Сообщение отредактировано: Akina -
                            За LAG() спасибо, осталось узнать если она в ЦФТ.

                            Добавлено
                            Цитата Akina @
                            А чё тогда вопрос в общем разделе?

                            Хотелось посмотреть разные реализации в остальных базах.
                              Да стандартная реализация...
                              ExpandedWrap disabled
                                select max(t1.dat), t2.dat
                                from table t1, table t2
                                where t1.dat < t2.dat
                                group by t2.dat

                              даёт пары дат, идентифицирующие "соседние" записи. Получить по ним соотв. значения и вычесть - как два пальца.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0479 ]   [ 16 queries used ]   [ Generated: 23.04.24, 19:57 GMT ]