|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.05.2009, 12:14 | #1 |
Пользователь
Регистрация: 26.10.2008
Сообщений: 14
|
Помогите с запросом
Уважаемы SQL-профи, помогите, пожалуйста, написать запрос:
Исходные данные: 1. База данных MS SQL Server 2005, состоит из нескольких таблиц. 2. Одна из них Archive: (ID as int, ObjID as int, MetDate as datetime, Value as float, Source as int). 3. Записи распределяются примерно равномерно с 01.01.2007г. по 31.12.2009г. 4. Значения поля Value дискретные, т.е. 1 или 0 заполняются хаотично. Таблица определяет дискретное состояние работы двигателя с определенным ObjID: 1 – работает, 0 – двигатель не работает. 5. Вторая таблица Objects: (ID as int, Name as varchar(50)) Создать запрос, выдающий за заданный период (StartDate, EndDate) все периоды работы двигателя. Поля запроса: (Name, StartDT, EndDT, Period=EndDT-StartDT, ) Т.е. каждая строка запроса должна содержать один период. Периоды не должны пересекаться. Name – наименование запроса, связанного с Objects по полю ID. |
06.05.2009, 12:34 | #2 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
если речь про решение задачи одним запросом, то явно не чистым СКЛ
здесь нужны знания аналитических фунок в МССКЛ (я силен в оракле) либо, если условия задачи не ограничивают применение ХП, то юзать ХП Последний раз редактировалось soleil@mmc; 06.05.2009 в 14:50. |
06.05.2009, 13:49 | #3 |
Пользователь
Регистрация: 26.10.2008
Сообщений: 14
|
|
06.05.2009, 15:28 | #4 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
оказалось все намного проще
не забудь сходить по этой ссылке Код:
|
06.05.2009, 20:10 | #5 |
Пользователь
Регистрация: 26.10.2008
Сообщений: 14
|
Большое спасибо, но, если не трудно, хотелось бы получить некоторые комментарии по решению.
Для чего нужно поле fValue в результирующем запросе? По условию оно содержит данные о включении и выключении двигателя (1 - двигатель включили, 0 - двигатель выключили). А периоды, которые нам нужно вывести в запросе - это непрерывные промежутки времени между значениями 1 и 0 для каждого двигателя (этих промежутков, рабочих состояний двигателя, может быть очень много, например он может включаться и выключаться несколько раз в день). Т.е. либо Вы немного не правильно поняли условие задачи, либо я не до конца понимаю логики Вашего решения. Последний раз редактировалось euronymous; 06.05.2009 в 21:09. |
06.05.2009, 21:21 | #6 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
уточнил - получи
Код:
если потребуется его считать в часа/минутах, то нужно будет вводить аналитическую функцию LEAD - есть такая в МССКЛ? fValue как раз показывает в каком состоянии твои объекты были в эти периоды, а то получается какой-то сферический конь в вакууме ты запрос-то выполни или ты из теоретиков? что не понятно спрашивай Последний раз редактировалось soleil@mmc; 06.05.2009 в 21:28. |
07.05.2009, 12:29 | #7 |
Пользователь
Регистрация: 26.10.2008
Сообщений: 14
|
Поскольку я не силен в SQL, хотелось бы вот что еще узнать:
1) Зачем в where условие 0=0? 2) Для чего в строке max(fDate) - min(fDate) + 1 Period нужно прибавлять 1 3) в строке order by 2 - 2 - это какое поле? Заранее благодарю за ответы. |
07.05.2009, 13:04 | #8 | ||
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
Цитата:
Цитата:
Код:
второе поле в запросе |
||
07.05.2009, 13:48 | #9 |
Пользователь
Регистрация: 26.10.2008
Сообщений: 14
|
Если не трудно, поясните, пожалуйста вот этот блок
Код:
|
07.05.2009, 22:06 | #10 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
сложно объяснять суть запроса человеку, который забыл скл и при этом не знал его
внутренний запрос группирует данные, схлопывая все записи, в которых повторяются имя_объекта и его состояние, т.е. если друг за другом идет несколько строк объект_1, состояние 0, то эти нексколько строк превратятся в одну, при этом в поле дата будет стоять минимальное значение из всех возможных в схлопнутых (на самом деле они сгруппированы, но так понятнее, я надеюсь ) внешний запрос позволяет найти вторую часть периода - EndDT, которая берется как следующее значение, но тут есть некая загвоздка - 1) для последней строки неясно что возьмется и 2) правильно ли будет если для объекта_1 в конце его перечисления период закроется начальной датой для объекта_2?! 3) перевод в часы/минуты/сек сделаешь самостоятельно |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите с запросом | Juries | Microsoft Office Access | 0 | 12.04.2009 00:29 |
Помогите с запросом | Viper666 | Microsoft Office Access | 2 | 14.05.2008 22:35 |
Помогите с запросом | Айвенго | Microsoft Office Access | 3 | 08.05.2008 09:07 |
Помогите с запросом | Blackmore | БД в Delphi | 3 | 07.05.2008 01:18 |
помогите с запросом | 9-11 | БД в Delphi | 4 | 20.11.2006 10:04 |