Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПОМОГИТЕ составить запрос, сложный запрос 
:(
    Опции темы
asdfghjkl
  Дата 10.9.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



user posted image
Необходимо выбрать из т.2.1.1. id, moment (первый), status, если status неизменен и >0, причем надо дополнительно посчитать длительность этого промежутка времени в минутах и вывести в столбец duration.
Думаю, что-то вроде вложенного запроса (может ошибаюсь), внешний выбирает, внутренний проверяет статус, подсчет длительности: (конечный момент- начальный момент)*60. Но как прописать добавку нового столбца, хотя бы набросок? Какой тип запроса использовать?

PM MAIL   Вверх
Gluttton
Дата 10.9.2009, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Так в чём конкретно проблема? Что именно не получается?


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 10.9.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Gluttton, она сама ни хрена не знает.
http://forum.sources.ru/index.php?showtopi...t&p=2361774

Это сообщение отредактировал(а) Akina - 10.9.2009, 08:50


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
asdfghjkl
Дата 10.9.2009, 08:55 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



Цитата(Akina @ 10.9.2009,  08:48)
Gluttton, она сама ни хрена не знает.
http://forum.sources.ru/index.php?showtopi...t&p=2361774

Грубость здесь не уместна, не хочешь помочь не надо, может не все такие снобы как ты. если внимательно посмотришь суть запроса изложена.

Добавлено через 4 минуты и 14 секунд
Цитата(Gluttton @ 10.9.2009,  08:47)
Так в чём конкретно проблема? Что именно не получается?

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

Добавлено через 11 минут и 6 секунд
сейчас читала про сложные запросы, написано, что если необходимо во вложенных запросах использовать одну и ту же таблицу, то запрос должен быть коррелированным.
PM MAIL   Вверх
Zloxa
Дата 10.9.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Думаю в задании ошибка. На каком основании посчитано duration = 120 для id =2 moment=14:00 - не ясно
Код

SQL> with s as (
  2     select 1 id, trunc(sysdate)+1/24 moment, 1 status from dual
  3     union all select 1 id, trunc(sysdate)+2/24 moment, 1 status from dual
  4     union all select 1 id, trunc(sysdate)+2/24+20/24/60 moment, 0 status from dual
  5     union all select 1 id, trunc(sysdate)+3/24 moment, 1 status from dual
  6     union all select 1 id, trunc(sysdate)+5/24 moment, 1 status from dual
  7     union all select 1 id, trunc(sysdate)+7/24 moment, 2 status from dual
  8     union all select 1 id, trunc(sysdate)+7.5/24 moment, 2 status from dual
  9     union all select 2 id, trunc(sysdate)+11/24 moment, 1 status from dual
 10     union all select 2 id, trunc(sysdate)+12/24 moment, 1 status from dual
 11     union all select 2 id, trunc(sysdate)+12/24+10/24/60 moment, 0 status from dual
 12     union all select 2 id, trunc(sysdate)+14/24 moment, 1 status from dual
 13     union all select 2 id, trunc(sysdate)+15/24 moment, 1 status from dual
 14  )
 15  select id
 16    , to_char(min(moment), 'HH24:MI') moment
 17    , (max(moment)-min(moment))*24*60 duration
 18    , status
 19  from (
 20    select
 21      s.*
 22      , sum(start_of_group) over (partition by id order by moment) grp_id
 23    from (
 24      select s.*
 25             , decode(status,lag(status) over (partition by id order by moment),0,1) start_of_group
 26      from s order by moment
 27    )s
 28  )s
 29  where status != 0
 30  group by grp_id,id,status
 31  order by moment
 32  ;
 
        ID MOMENT   DURATION     STATUS
---------- ------ ---------- ----------
         1 01:00          60          1
         1 03:00         120          1
         1 07:00          30          2
         2 11:00          60          1
         2 14:00          60          1



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
asdfghjkl
Дата 10.9.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



СПАСИБО ОГРОМНОЕ. А можно немного пояснений начиная с 16 строки, плиз? Думаю в последней строки опечатка, а может для проверки специально так задумано.
PM MAIL   Вверх
Zloxa
Дата 10.9.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



asdfghjkl, Этот запрос АФАИК сможет отработать только на Оракле. Возможно на PG. Какая у вас целевая платформа?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
asdfghjkl
Дата 10.9.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



Это задание, вроде как организация использует Oracle, но я сама работала только с MySQL. возможно как-то переписать? я вот начала разбирать, но не все понятно.
PM MAIL   Вверх
Zloxa
Дата 10.9.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(asdfghjkl @  10.9.2009,  10:00 Найти цитируемый пост)
возможно как-то переписать

Как раз над этим сейчас и думаю. Если Gluttton меня опередит, будет ой как досадно smile 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
asdfghjkl
Дата 10.9.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



Что происходит в: 
20    select
21      s.*
22      , sum(start_of_group) over (partition by id order by moment) grp_id
23    from (
24      select s.*
25             , decode(status,lag(status) over (partition by id order by moment),0,1) start_of_group
26      from s order by moment
27    )s
28  )s
?
PM MAIL   Вверх
Akina
Дата 10.9.2009, 10:08 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(asdfghjkl @  10.9.2009,  09:55 Найти цитируемый пост)
если внимательно посмотришь суть запроса изложена.

Пока - нет. Если запрос на приведённых исходных данных даёт приведённый выход, это не значит, что логика получения ответа соответствует истинной. И на другом наборе входных данных может получиться хрень. Именно этого ты никак не можешь понять.
Иными словами, модель чёрного ящика всегда приближённая.

Это сообщение отредактировал(а) Akina - 10.9.2009, 10:18


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 10.9.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Строка 25 сравнивает статус со следующей по моменту в разрезе id строчкой, в случае если совпадает, выставляет 0, иначе 1. Получается еденичка проставляется для первого статуса в группе подрядидущих.
Строка 22 считает накапливающую сумму по посчитанному в строке 25 значению в разрезе id в пореядке возрастания момента. Получается расчитывается какбы уникальный идентификатор группы подрядидущих.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
asdfghjkl
Дата 10.9.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



Цитата(Zloxa @ 10.9.2009,  10:12)
Строка 25 сравнивает статус со следующей по моменту в разрезе id строчкой, в случае если совпадает, выставляет 0, иначе 1. Получается еденичка проставляется для первого статуса в группе подрядидущих.
Строка 22 считает накапливающую сумму по посчитанному в строке 25 значению в разрезе id в пореядке возрастания момента. Получается расчитывается какбы уникальный идентификатор группы подрядидущих.

А это одинаково для оракл и MySQL? откуда grp_id, я поняла, что это идентификатор повторяющих групп, почему он не указан в 25 строке? А для чего эта сумма?
PM MAIL   Вверх
Zloxa
Дата 10.9.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(asdfghjkl @  10.9.2009,  10:32 Найти цитируемый пост)
А это одинаково для оракл и MySQL? 

Я же сказал. Это только для оракл. Может быть Постгри так же умеет.

Цитата(asdfghjkl @  10.9.2009,  10:32 Найти цитируемый пост)
почему он не указан в 25 строке? 

Потому что на основании значения, полученного в 25й, он расчитывается
Цитата(asdfghjkl @  10.9.2009,  10:32 Найти цитируемый пост)
А для чего эта сумма? 

Думайте

можете взорвать себе еще мозг моделью.. это вот точно ТОЛЬКО для оракла, прчем начиная только с 10й версии
работает по тому же принципу
Код

 15  select id
 16         ,to_char(min(moment),'HH24:MI') moment
 17         ,(max(moment)-min(moment))*24*60 duration
 18         , status
 19  from (
 20    select * from s
 21    model
 22      partition by (id)
 23      dimension by (row_number() over (order by moment) rn)
 24      measures (status,0 grpid,moment)
 25      rules(
 26        grpid[any] = nvl(grpid[cv()-1],0) + decode(status[cv()],status[cv()-1],0,1)
 27      )
 28  )s
 29  where status > 0
 30  group by id,grpid,status
 31  order by moment
 32  ;
 
        ID MOMENT   DURATION     STATUS
---------- ------ ---------- ----------
         1 01:00          60          1
         1 03:00         120          1
         1 07:00          30          2
         2 11:00          60          1
         2 14:00          60          1
 


Добавлено через 6 минут
asdfghjkl, А может ну его? Если вы поакажете решение на собеседовании, но затруднитесь повторить на практике в оффисе, врядли вы пройдете испытательный срок. Может куда попроще попробовать сунутсья, где требования чуть мене высокие?

Это сообщение отредактировал(а) Zloxa - 10.9.2009, 10:39


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
asdfghjkl
Дата 10.9.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 9.9.2009

Репутация: нет
Всего: нет



Не злитесь, просто мне это объяснять и я волнуюсь, это не просто задание нудного препода. Может я совсем безнадежна, но сдаваться не хочется.
Насчет grp_id, я всегда думала, что если что-то вычисляется, то должно указываться куда это все поместить.
А сумма- это количество групп, или количество записей в группе? Вроде должно быть записей, но если считается по grp_id...

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.