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

Откуда:
Сообщений: 4
Я не особо много в своей жизни работал с SQL, а тут понадобилось решить проблему:
нужно сделать выборку по времени из одной таблицы таким образом, чтобы в ней хранилось максимальное и минимальное время выполнения тестирования (MIN(data_start) и MAX(data_finish)) для дисциплины (discipline_id), для каждого студента (stud_id). Иными словами нужно составить временной промежуток по discipline_id для каждого stud_id. Сам пока додумался только до такого, но оно просто берет максимальное значение по времени для каждой дисциплины:


SELECT R.id, R.stud_id, R.test_id, R.data_start, R.mark, R.why, T.discipline_id, R_fin.id AS fin_id, R_fin.stud_id AS fin_stud_id, R_fin.data_finish AS fin_data_finish,
R_fin.discipline_id AS fin_discipline_id
FROM dbo.results AS R INNER JOIN
dbo.tests AS T ON R.test_id = T.test_id INNER JOIN
(SELECT R0.id, R0.stud_id, R0.data_finish, R0.mark, R0.why, T0.discipline_id
FROM dbo.results AS R0 INNER JOIN
dbo.tests AS T0 ON R0.test_id = T0.test_id
WHERE (R0.data_finish =
(SELECT MAX(R01.data_finish) AS max_data
FROM dbo.results AS R01 INNER JOIN
dbo.tests AS T01 ON R01.test_id = T01.test_id
WHERE (T01.discipline_id = T0.discipline_id) AND (T01.typeaction_id = 2)))) AS R_fin ON T.discipline_id = R_fin.discipline_id
WHERE (R.data_start =
(SELECT MIN(R1.data_start) AS min_data
FROM dbo.results AS R1 INNER JOIN
dbo.tests AS T1 ON R1.test_id = T1.test_id
WHERE (T1.discipline_id = T.discipline_id) AND (T1.typeaction_id = 2)))

Кстати, вся работа ведется в BI Dev Studio, так что нужно чтобы запрос был в виде, подходящем под составление именованного запроса для DataMining.
Помогите разобраться.
10 мар 13, 19:12    [14032289]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
aleks2
Guest
Ты бы лучче таблицы и их содержимое описал внятно.
10 мар 13, 19:37    [14032369]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Алексей Мельников
Member

Откуда:
Сообщений: 4
по сути я делаю выборку из 1 таблицы:
dbo.results:
id - int,
stud_id - int,
test_id - int,
data_start - datetime,
data_finish - datetime,
mark - int,
why - nvarchar.

А вообще вот вся БД:

К сообщению приложен файл. Размер - 45Kb
10 мар 13, 19:44    [14032413]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Алексей Мельников
нужно составить временной промежуток по discipline_id для каждого stud_id
select
  t.discipline_id, r.stud_id, 
  min(r.data_start)first_start, 
  max(r.data_finish)last_end,
  count(*) attempts
from results r
join tests t on t.test_id=r.test_id
group by t.discipline_id, r.stud_id
10 мар 13, 21:30    [14032680]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Алексей Мельников
Member

Откуда:
Сообщений: 4
Окей, поставлю вопрос по другому:
Можно ли вообще выбрать из dbo.results таким образом, чтобы для каждого студента (stud_id) были выбраны временные промежутки изучения дисциплины ( минимальное и максимальное время MIN(data_start), MAX(data_finish)) для каждой дисциплины (discipline_id).
Если есть таблица результатов, где есть stud_id, test_id, data_start_data_finish и так же discipline_id (можно получить джойном из test_id)

Т.е. в результате должно получится что-то вроде
stud_id, discipline_id, data_start, data_finish
1, 1, 2012-09-04, 2012-10-05
1, 2, 2012-08-12, 2012-11-07
1, 3, 2012-07-04, 2012-08-05
2,1,...,...
2,2,...,...
2,3,...,...
и т.д.
10 мар 13, 21:30    [14032682]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Алексей Мельников
Member

Откуда:
Сообщений: 4
Cygapb-007, спасибо! То, что надо
10 мар 13, 21:38    [14032696]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить