Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Просьба помочь с запросом  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
Большая просьба помочь. Есть таблица оценок студентов. У одного студента м.б. несколько пересдач. Необходимо вывести список дисциплин с оценками ПОСЛЕДНЕЙ пересадчи.
В упрощенном виде я делаю так
SELECT  *
FROM    d_ball b
        INNER JOIN d_subj sb on (b.c_subj = sb.code)
WHERE     (b.code = (SELECT top 1
                              code
                       FROM   d_ball b1
                       WHERE  (b1.c_people = b.c_people)
                              AND (s1.c_subj = s.c_subj)
                       ORDER BY b1.YearOfDate DESC  -- уч.год 
                             ,kolsdach desc -- номер попытки
                      ))
Но если надо вывести много человек, то сильно тормозит из за подзапроса.
Есть др. варианты?
Спасибо.
24 сен 09, 13:43    [7702938]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oleg6619,

делайте через APPLY, может получится быстрее. есть еще вариант,примерно такой,
из вашего текста не понял какая таблица кто, разбираться лень, приведете сами:
SELECT  student, year, s.subj, substring(max(cast(kolsdach as char(10)) + cast(ball as char(10))), 11,10)
FROM Balls b join Subjs s on b.subj_code = s.subj_code
group by student, year, s.subj
24 сен 09, 14:10    [7703142]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
iljy
Oleg6619,

делайте через APPLY, может получится быстрее. есть еще вариант,примерно такой,
из вашего текста не понял какая таблица кто, разбираться лень, приведете сами:
SELECT  student, year, s.subj, substring(max(cast(kolsdach as char(10)) + cast(ball as char(10))), 11,10)
FROM Balls b join Subjs s on b.subj_code = s.subj_code
group by student, year, s.subj

1.APPLY - это что такое
2.Второй вариант к сожалению так не получится, там же еще оченка, № ведомости и .т.д.
24 сен 09, 14:17    [7703221]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33343
Блог
Oleg6619
APPLY - это что такое

возможно вы сможете узнать это в справке?
24 сен 09, 14:27    [7703305]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Oleg6619
iljy
Oleg6619,

делайте через APPLY, может получится быстрее. есть еще вариант,примерно такой,
из вашего текста не понял какая таблица кто, разбираться лень, приведете сами:
SELECT  student, year, s.subj, substring(max(cast(kolsdach as char(10)) + cast(ball as char(10))), 11,10)
FROM Balls b join Subjs s on b.subj_code = s.subj_code
group by student, year, s.subj

1.APPLY - это что такое
2.Второй вариант к сожалению так не получится, там же еще оченка, № ведомости и .т.д.


APPLY

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум.
24 сен 09, 14:31    [7703338]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oleg6619

2.Второй вариант к сожалению так не получится, там же еще оченка, № ведомости и .т.д.


А вы внимательно ознакомились со вторым вариантом? Оценка там как раз извлекается. Похожим образом можно извлеч № ведомости и т.д.
24 сен 09, 14:37    [7703396]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
iljy
Oleg6619

2.Второй вариант к сожалению так не получится, там же еще оченка, № ведомости и .т.д.


А вы внимательно ознакомились со вторым вариантом? Оценка там как раз извлекается. Похожим образом можно извлеч № ведомости и т.д.

Здесь извлекается MAX номер попытки (правильно), но НОМЕР ведомости НЕОБЯЗАТЕЛЬНо может быть MAX (сдавал с др. группой, там своя нумерация). А оценку так вообще не получиться вытащить. Или я не прав?
24 сен 09, 14:41    [7703436]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oleg6619,

max(cast(kolsdach as char(10)) + cast(ball as char(10)))

смотрим еще раз, ОЧЕНЬ внимательно. Выбирается максимальная строка, содержащая и номер попытки, и оценку. Туда же можно добавить и номер ведомости (в конец этой же строки дописать).
24 сен 09, 14:45    [7703471]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
iljy,
Спасибо не заметил, в теории это выход, но практически придется строку потом резать по смысловым полям.
М.б. что-то есть другое.
APPLY проверю. М.б. и подойдет.
24 сен 09, 14:48    [7703500]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oleg6619
iljy,
Спасибо не заметил, в теории это выход, но практически придется строку потом резать по смысловым полям.
М.б. что-то есть другое.
APPLY проверю. М.б. и подойдет.

? И? вы получите все поля, которые нужно, потом вырезать их из строки уже не фокус, только фиксированного размера их делайте. Но на практике если таблица хорошо проиндексирована - APPLY может оказаться выгоднее.
24 сен 09, 14:52    [7703540]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
iljy
...из вашего текста не понял какая таблица кто, разбираться лень, приведете сами:

+1. Опишите структуры таблиц, предоставьте тестовые данные, резалты, которые хотите получить, тогда и будут вам точные ответы, а так только приблизительные. Вот один из вариантов:
SELECT *
FROM d_subj AS sb
  LEFT JOIN
    (SELECT TOP 1 WITH TIES *
     FROM d_ball
     ORDER BY Row_Number()
     OVER (PARTITION BY c_people, c_subj
           ORDER BY YearOfDate DESC, kolsdach DESC)) AS b ON sb.code = b.c_subj

Если d_subj - это дисциплина, то LEFT JOIN, т.к. не все студенты занимаются по всем дисциплинам.
24 сен 09, 16:55    [7704579]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
пардон, c LEFT JOIN погорячился
24 сен 09, 16:59    [7704619]     Ответить | Цитировать Сообщить модератору
 Re: Просьба помочь с запросом  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
iljy
Спасибо, APPLY сильно помог.

DVN,
Такой вариант оказался более затратным, Но тоже спасибо
25 сен 09, 10:39    [7706914]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить