Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
1

Задача в тесте

12.04.2016, 15:29. Показов 1054. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача 1.
Есть таблица UDFs с колонками UDFName , UdfValue, Date.
Первичный ключ - (UDFName, Date)
UDFName может иметь три значения - “V”, “Border1”, “Border2”.
Требуется написать запрос, который выдаст количество записей следующего типа:
Значение в колонке UDFValue соответствующее V должно располагаться между значениями соответствующими Border1 и Border2 в рамках одной даты.

Скрипт для создания таблиц с тестовыми данными:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE UDFs 
(
udfname nvarchar(250),
udfvalue FLOAT,
[DATE] DATE,
PRIMARY KEY(DATE,udfname)
) 
 
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'V', 10, CAST(N'2013-10-10' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border1', 5, CAST(N'2013-10-10' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border2', 20, CAST(N'2013-10-10' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'V', 10, CAST(N'2013-10-11' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border1', 50, CAST(N'2013-10-11' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border2', 70, CAST(N'2013-10-11' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'V', 10, CAST(N'2013-10-13' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border1', 10, CAST(N'2013-10-13' AS DATE))
GO
INSERT [dbo].[UDFs] ([udfname], [udfvalue], [DATE]) VALUES (N'Border2', 10, CAST(N'2013-10-13' AS DATE))
GO
я задачу решил так

SQL
1
2
3
4
5
SELECT COUNT(*) FROM UDFs u
LEFT JOIN (SELECT * FROM UDFs WHERE udfname='V') v ON u.date=v.date
LEFT JOIN (SELECT * FROM UDFs WHERE udfname='Border1') b1 ON u.date=b1.date
LEFT JOIN (SELECT * FROM UDFs WHERE udfname='Border2') b2 ON u.date=b2.date
WHERE u.udfname='v' AND (u.udfvalue > b1.udfvalue) AND u.udfvalue<b2.udfvalue
подскажите варианты лучше
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2016, 15:29
Ответы с готовыми решениями:

Задача на геометрию. Валит на последнем тесте
Всем доброго времени суток. Задача со школы программиста Условие: В начале координат установлена...

Почему Wrong answer на 6 тесте задача 57 acmp?
Подскажите пожалуйста почему в задаче 57 на 6 тесте Wrong answer? Условие на картинке ...

Исправить ошибки в тесте Миллера и тесте Соловея-Штрассена
Надо написать программу, которая имеет 2 алгоритма: Тест Миллера...

Задача «Форматирование кода» не проходит все тесты, теперь на 9-ом тесте заваливается
Задача «Форматирование кода» не проходит все тесты, теперь на 9-ом тесте заваливается. Примеры,...

9
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
12.04.2016, 15:52 2
T-SQL
1
2
3
4
5
6
SELECT v.DATE ,COUNT(*) 
FROM UDFs u
LEFT JOIN UDFs b1 ON (b1.udfname='Border1' and  u.DATE=b1.DATE)
LEFT JOIN UDFs b2 ON(b2.udfname='Border2' and u.DATE=b2.DATE)
WHERE u.udfname='v' AND u.udfvalue between b1.udfvalue AND b2.udfvalue
GROUP by v.DATE
Ну и конечно, не забыть сгруппировать по датам.

Добавлено через 5 минут
Да, и ещё неплохо бы предусмотреть ситуацию, когда либо Border1, либо Border2, либо оба не найдутся. На этот случай нужно использовать функцию ISNULL или вообще такие строки отфильтровать, добавив условие

b1.udfvalue is not NULL AND b2.udfvalue is not NULL
1
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
12.04.2016, 15:58  [ТС] 3
это учебная задача, усложнять не нужно

Добавлено через 3 минуты
i-sm,
а вы свой ответ не проверяли?
Код
Не удалось привязать составной идентификатор "v.DATE".
0
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
12.04.2016, 16:28 4
Простите, в первой и последней строке v.DATE нужно заменить на u.DATE

Добавлено через 2 минуты
И ещё замечу, что between a and b работает как >=a и <=b. В Вашем скрипте неравенства были строгими.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
12.04.2016, 16:32  [ТС] 5
Цитата Сообщение от i-sm Посмотреть сообщение
Вашем скрипте неравенства были строгими.
это потому что в задании сказано
Цитата Сообщение от qwertehok Посмотреть сообщение
Значение .. должно располагаться между
поэтому с попадаем в ответ строк 10\10\10 я не соглашусь
0
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
12.04.2016, 16:34 6
Цитата Сообщение от qwertehok Посмотреть сообщение
это учебная задача, усложнять не нужно
Так я ж наоборот, упрощаю

Добавлено через 50 секунд
Цитата Сообщение от qwertehok Посмотреть сообщение
должно располагаться между
between - означает "между" (англ.)
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
12.04.2016, 16:37  [ТС] 7
Цитата Сообщение от i-sm Посмотреть сообщение
Так я ж наоборот, упрощаю
добавляя NULL в таблицу, в которой его нет?

Цитата Сообщение от i-sm Посмотреть сообщение
between - означает "между"
располагается ли 10 между 10 и 10 ))))
0
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
12.04.2016, 16:43 8
Цитата Сообщение от qwertehok Посмотреть сообщение
добавляя NULL в таблицу, в которой его нет?
Суть программирования в том, чтобы написать код, который более-менее стабильно работает для всех возможных ситуаций, а не только для данной конкретной таблицы.
У нас, например, в институте препод знаете как тестировал "учебные" программы? Он вбивал в качестве исходных данных какую-то белиберду с потолка, и смотрел, как код себя поведёт.

Когда Вы используете LEFT JOIN, то вполне возможно появление значений NULL. Используйте INNER JOIN, делов-то...

Цитата Сообщение от qwertehok Посмотреть сообщение
располагается ли 10 между 10 и 10 ))))
Ну... Да! А Вы считаете иначе?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
12.04.2016, 16:53  [ТС] 9
Цитата Сообщение от i-sm Посмотреть сообщение
У нас, например, в институте препод знаете как тестировал "учебные" программы?
вы бы знали как "тестируют" программы 60 бухгалтеров

Цитата Сообщение от i-sm Посмотреть сообщение
Когда Вы используете LEFT JOIN, то вполне возможно появление значений NULL. Используйте INNER JOIN, делов-то...
если бы я писал не думая, то да, но голова то есть - она отличит когда что нужно использовать

Цитата Сообщение от i-sm Посмотреть сообщение
Ну... Да! А Вы считаете иначе?
конечно

спасибо за решение, может кто-то предложит что-то еще
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
12.04.2016, 17:13 10
Цитата Сообщение от qwertehok Посмотреть сообщение
Цитата Сообщение от Сообщение от i-sm
Когда Вы используете LEFT JOIN, то вполне возможно появление значений NULL. Используйте INNER JOIN, делов-то...
если бы я писал не думая, то да, но голова то есть - она отличит когда что нужно использовать
Спасибо! Очень смешно! Пишите ещё!

Что вернёт
T-SQL
1
u.udfvalue between NULL AND b2.udfvalue
не подскажете?
И зачем тогда LEFT JOIN UDFs b1 ON ?

Прикол с этими джойнами с производными таблицами я навскидку не понял, поэтому промолчу.
0
12.04.2016, 17:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2016, 17:13
Помогаю со студенческими работами здесь

проблема: задача n550 на acmp. НА 6 тесте выдает ошибку с надписью Presentation error - прошу обьяснить
Условие: День программиста отмечается в 255-й день года (при этом 1 января считается нулевым...

Рандом в тесте
У меня есть код, который запускает тест, но мне надо добавить так, чтобы вопросы выпадали на рандом...

Ошибки в тесте
Сделал что-то типа теста. Если выбираю в ИЗМЕНЕНИЕ теста во втором вопросе, что правильный вариант...

Подсчёт % в тесте
Добрый вечер, хочу создать тест в html, чтобы после проверки результат выводился в процентах. Но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru