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

Откуда:
Сообщений: 41
Добрый день! Не могу понять как составить запрос, есть таблица:

ID | date | kind
1 20.11.2011 10:00 1
1 20.11.2011 12:00 0
1 20.11.2011 13:00 1
1 20.11.2011 13:15 0
1 20.11.2011 13:20 1
1 20.11.2011 18:00 0

В результате необходимо получить следующее:

ID | startdate | enddate
1 20.11.2011 10:00 20.11.2011 12:00
1 20.11.2011 13:00 20.11.2011 13:15
1 20.11.2011 13:20 20.11.2011 18:00

Буду признателен за помощь! :)
30 ноя 11, 21:57    [11686370]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
moldis,

Добрый вечер!

Можно использовать подзапрос:

SELECT startdate,
   (SELECT MIN(startdate) FROM tbl_name WHERE date > tbl.date) AS enddate
FROM tbl_name AS tbl
30 ноя 11, 22:37    [11686579]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
moldis
Member

Откуда:
Сообщений: 41
ммм, не совсем понятно как этот запрос может мне помочь....
ID таблицы может быть различным...
А в данном запросе даты выбираются хаотичным способом...
1 дек 11, 00:18    [11686900]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
moldis,

Да, вы правы запрос выдает не совсем то, что нужно. Внес исправления:

SELECT id, startdate, enddate FROM
   (SELECT row_number() over(partition by id order by date) as row_num,  id, startdate,
      (SELECT MIN(startdate) FROM tbl_name WHERE date > tbl.date AND id = tbl.id) AS enddate
   FROM tbl_name AS tbl
   ) AS tmp
WHERE row_num%2 <> 0 

Для каждой строки в подзапросе выбираются строки с таким же идентификатором, но большей датой, т.е. для строки

ID date
1 20.11.2011 10:00

будут выбраны строки

1 20.11.2011 12:00
1 20.11.2011 13:00
...

Затем ищем минимальную дату среди этих строк.
1 дек 11, 00:35    [11686937]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
Внес последние исправления:

SELECT id, startdate, enddate FROM
   (SELECT row_number() over(partition by id order by date) as row_num,  id, date as startdate,
      (SELECT MIN(date) FROM tbl_name WHERE date > tbl.date AND id = tbl.id) AS enddate
   FROM tbl_name AS tbl
   ) AS tmp
WHERE row_num%2 <> 0
1 дек 11, 01:09    [11687045]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
moldis
Member

Откуда:
Сообщений: 41
Спасибо!
Сегодня вечером попробую ...
1 дек 11, 12:03    [11688386]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
fabulaspb, перемудрили. Всё намного проще:
SELECT	 F.ID
	,F.[Date]	AS [From]
	,T.[Date]	AS [To]
FROM	dbo.[Table] F OUTER APPLY (
		SELECT	Top(1) *
		FROM	dbo.[Table]	T
		WHERE	    T.ID	 = F.ID
			AND T.[Date]	>= F.[Date]
		ORDER BY T.[Date]
	) F
1 дек 11, 17:48    [11691467]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить