![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: нет Всего: 2 |
Доброго времени суток!
Подскажите, как написать запрос, ничего в голову не лезет. Я намеренно упростил таблички, чтобы стала ясна суть, что я хочу. Итак, у меня есть таблица: ------------------------------------------------- id | блок | дата входа | дата выхода | ------------------------------------------------- 01| дом | 12.01.2009 | 13.01.2009 | 02| дом | 13.01.2009 | 15.02.2009 | 03|дача | 15.02.2009 | 15.03.2009 | 04|дом | 15.03.2009 | 16.03.2009 | 05|дом2 | 16.03.2009 | 17.04.2009 | 06|дача | 17.04.2009 | 18.04.2009 | 07|дом | 18.04.2009 | 29.04.2009 | ------------------------------------------------- на выходе хочу получить следующее: ------------------------------------------------- блок | Дата входа | Дата выхода ------------------------------------------------- дом | 12.01.2009 | 15.02.2009 | дача | 15.02.2009 | 15.03.2009 | дом | 15.03.2009 | 16.03.2009 | дом2 | 16.03.2009 | 17.04.2009 | дача | 17.04.2009 | 18.04.2009 | дом | 18.04.2009 | 29.04.2009 | ------------------------------------------------- т.е. если идет несколько раз подряд одинаковый блок, нужно выгрузить его одной строкой с минимальной датой входа и максимальной датой выхода для этих строк подряд. Если делать distinct, то выгружается 1 раз для всех строк, group by тоже самое, подскажите, как можно это сделать. |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Для таблицы:
![]() запрос:
Вернет данные: ![]() -------------------- Слава Україні! |
|||
|
||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
MadCoder, на сколько я помню, у Вас MS SQL, если не ошибаюсь то 2005, а значит аналитические функции хоть както реализованы.
1) Если в исходных данных не магия данных а действительно предыдущая "Дата выхода" равна следующей "дате входа"
2) Если предположение 1 не верно, остается только посчитать ROW_NUMBER в нужном нам порядке и выполнять соединение с предыдущей строкой по нему. У оракла есть более развитая аналитическая функция, которая нам позволит избежать self join'a, аналога которой в ms sql я не нашел
Gluttton, Как всегда зачет. ;) Отвык я от синтаксиса без аналитики, с ходу не смог бы бацнуть решения. Завтречка помедитирую над твоим примером. ;) -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
Gluttton |
|
||||||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
![]()
Да я вот тоже далеко не "с ходу"... ![]()
Ну а, что бы процесс медитации был приятнее я прокоментирую: Внешний запрос отбрасываем, что бы не мешал.
Основная логика зарыта во внутреннем запросе. Суть в следующем: если строка имеет значение поля "блок" отличное от предыдущей и последующей записи, (иными словами отдельно идущая запись), то оставляем её без изменений, а если мы "наткнулись" на группу, то в поле начальной даты мы для всей текущей группы подставляем наименьшее значение этой группы, а в поле даты окончание – максимальное. А внешний запрос, просто это всё дело ужимает. Несколько искусственно смотриться order by S.date_out в конце внешнего запроса (т.к. построен на предположении "нарастании" дат), его можно заменить например на сортировку по id, при этом distinct заменить на какой-нибудь "агрегат", например min().
-------------------- Слава Україні! |
||||||||||
|
|||||||||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Gluttton, У меня не завелся твой пример. У оракли есть ограничение на глубину вложенности коррелированного подзапроса. Но принцип, кажется, я уловил. Спасибо за пояснения.
Заодно, мне кажется, заложенный тобой принцип я слегка упростил. Заодно, отвязал его от привязки к отношению TA.id=T.id-1, которое в принципе не может быть жизненным Однако работать должно только для случая, когда предыдущий date_out = текущий date_in
Буду рад, если ктонить найдет брешь в предложенном решении. Это сообщение отредактировал(а) Zloxa - 30.4.2009, 09:13 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
DimW,
MadCoder, Прости, походу я ввел тебя в заблуждение. MS SQL не поддерживает выражения order by в предложении over для Aggregate Window Functions, только для Ranking Window Functions :(( Потому накапливающую суму посчитать на нем не удастя Таки ему еще расти и расти до оракли. Это сообщение отредактировал(а) Zloxa - 30.4.2009, 09:53 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |