-
Есть таблица (ниже приведены 2 поля из нее). Как написать запрос, выбрав по времени только одну запись в диапазоне например, 2 часа по каждому id (второй столбец), ближайшую к первой записи по времени?
2008-04-14 22:44:00.000 20028 2008-04-15 00:26:00.000 20028 2008-04-15 00:49:00.000 20028 2008-04-15 01:02:00.000 20028 2008-04-15 01:03:00.000 20028 2008-04-15 02:43:00.000 20028 2008-04-15 02:45:00.000 20028 2008-04-15 04:24:00.000 20028 2008-04-15 04:29:00.000 20028 2008-04-15 05:49:00.000 20028 2008-04-15 06:04:00.000 20028 2008-04-15 06:12:00.000 20028 2008-04-15 06:13:00.000 20028 2008-04-15 07:30:00.000 20028 2008-04-15 07:44:00.000 20028 2008-04-15 07:51:00.000 20028 2008-04-15 09:11:00.000 20028 2008-04-15 09:12:00.000 20028 2008-04-15 09:29:00.000 20028 2008-04-15 09:34:00.000 20028 2008-04-15 10:50:00.000 20028 2008-04-15 10:52:00.000 20028 2008-04-15 11:00:00.000 20028 2008-04-15 11:13:00.000 20028 2008-04-15 11:16:00.000 20028 2008-04-15 12:31:00.000 20028 2008-04-15 12:41:00.000 20028 2008-04-15 12:42:00.000 20028 2008-04-15 12:46:00.000 20028 2008-04-15 12:51:00.000 20028 2008-04-15 12:54:00.000 20028 2008-04-15 14:04:00.000 20028 2008-04-15 14:10:00.000 20028 2008-04-15 14:19:00.000 20028 2008-04-15 14:26:00.000 20028 2008-04-15 15:43:00.000 20028 2008-04-15 15:47:00.000 20028 2008-04-15 15:48:00.000 20028 2008-04-15 16:03:00.000 20028 2008-04-15 16:04:00.000 20028 2008-04-15 16:05:00.000 20028 2008-04-15 16:10:00.000 20028 2008-04-15 17:22:00.000 20028 2008-04-15 17:45:00.000 20028 2008-04-15 17:46:00.000 20028 2008-04-15 19:04:00.000 20028 2008-04-15 19:05:00.000 20028 2008-04-15 19:29:00.000 20028 2008-04-15 20:43:00.000 20028 2008-04-15 21:05:00.000 20028 2008-04-15 22:24:00.000 20028 2008-04-15 22:43:00.000 20028 2008-04-15 22:44:00.000 20028 2008-04-16 00:06:00.000 20028 2008-04-16 00:28:00.000 20028 2008-04-16 00:52:00.000 20028 2008-04-16 02:31:00.000 20028 2008-04-16 02:34:00.000 20028 2008-04-16 04:14:00.000 20028 2008-04-16 04:15:00.000 20028 2008-04-16 05:25:00.000 20028 2008-04-16 05:26:00.000 20028 2008-04-16 05:53:00.000 20028 2008-04-16 06:00:00.000 20028 2008-04-16 07:05:00.000 20028 2008-04-16 08:43:00.000 20028 2008-04-16 08:45:00.000 20028 2008-04-16 08:51:00.000 20028 2008-04-16 09:10:00.000 20028 2008-04-16 09:12:00.000 20028 2008-04-16 09:17:00.000 20028 2008-04-16 10:25:00.000 20028 2008-04-16 10:29:00.000 20028 2008-04-16 10:48:00.000 20028 2008-04-16 10:56:00.000 20028 2008-04-16 12:09:00.000 20028 2008-04-16 12:29:00.000 20028 2008-04-16 12:30:00.000 20028 2008-04-16 12:31:00.000 20028 2008-04-16 12:32:00.000 20028 2008-04-16 13:39:00.000 20028 2008-04-16 13:40:00.000 20028 2008-04-16 13:47:00.000 20028 2008-04-16 13:48:00.000 20028 2008-04-16 14:08:00.000 20028 2008-04-16 14:09:00.000 20028 2008-04-16 14:10:00.000 20028 2008-04-16 14:11:00.000 20028 2008-04-16 14:13:00.000 20028 2008-04-16 15:19:00.000 20028 2008-04-16 15:53:00.000 20028 2008-04-16 16:55:00.000 20028 2008-04-16 16:58:00.000 20028 2008-04-16 17:06:00.000 20028 2008-04-16 17:24:00.000 20028 2008-04-16 17:34:00.000 20028 2008-04-16 17:35:00.000 20028 2008-04-16 18:40:00.000 20028 2008-04-16 18:41:00.000 20028 2008-04-16 18:43:00.000 20028 2008-04-16 19:01:00.000 20028 2008-04-16 19:19:00.000 20028 2008-04-16 20:23:00.000 20028 2008-04-16 20:41:00.000 20028 2008-04-16 22:02:00.000 20028 2008-04-16 22:25:00.000 20028 2008-04-16 23:47:00.000 20028 2008-04-17 00:05:00.000 20028 2008-04-17 02:20:00.000 20028 2008-04-17 02:23:00.000 20028 2008-04-17 03:20:00.000 20028 2008-04-17 04:06:00.000 20028 2008-04-17 05:00:00.000 20028 2008-04-17 05:42:00.000 20028 2008-04-15 00:18:00.000 20029 2008-04-15 01:18:00.000 20029 2008-04-15 02:18:00.000 20029 2008-04-15 03:18:00.000 20029 2008-04-15 04:20:00.000 20029 2008-04-15 05:20:00.000 20029 2008-04-15 06:20:00.000 20029 2008-04-15 07:20:00.000 20029 2008-04-15 08:22:00.000 20029 2008-04-15 09:22:00.000 20029 2008-04-15 10:22:00.000 20029 2008-04-15 11:22:00.000 20029 2008-04-15 12:24:00.000 20029 2008-04-15 13:24:00.000 20029 2008-04-15 15:40:00.000 20029 2008-04-15 16:42:00.000 20029 2008-04-15 17:42:00.000 20029 2008-04-15 18:42:00.000 20029 2008-04-15 19:42:00.000 20029 2008-04-15 20:44:00.000 20029 2008-04-15 21:44:00.000 20029 2008-04-15 22:44:00.000 20029 2008-04-15 23:44:00.000 20029 2008-04-16 00:46:00.000 20029 2008-04-16 01:46:00.000 20029 2008-04-16 02:46:00.000 20029 2008-04-16 03:46:00.000 20029 2008-04-16 04:48:00.000 20029 2008-04-16 05:48:00.000 20029 2008-04-16 06:48:00.000 20029 2008-04-16 07:48:00.000 20029 2008-04-16 08:50:00.000 20029 2008-04-16 09:50:00.000 20029 2008-04-16 10:50:00.000 20029 2008-04-16 11:50:00.000 20029 2008-04-16 12:50:00.000 20029 2008-04-16 13:52:00.000 20029 2008-04-16 14:52:00.000 20029 2008-04-16 15:52:00.000 20029 2008-04-16 16:52:00.000 20029 2008-04-16 17:54:00.000 20029 2008-04-16 18:54:00.000 20029 2008-04-16 19:54:00.000 20029 2008-04-16 20:54:00.000 20029 2008-04-16 21:56:00.000 20029 2008-04-16 22:56:00.000 20029 2008-04-16 23:56:00.000 20029 2008-04-17 00:56:00.000 20029 2008-04-17 01:58:00.000 20029 2008-04-17 02:58:00.000 20029 2008-04-17 03:58:00.000 20029 2008-04-17 04:58:00.000 20029 2008-04-17 06:00:00.000 20029
Т.е. должно получиться типа: 2008-04-14 22:44:00.000 20028 2008-04-15 00:49:00.000 20028 2008-04-15 02:45:00.000 20028 2008-04-15 04:24:00.000 20028 и т.д.
Помогите, пожалуйста.
-
гораздо проще пробежаться по курсору, чем ломать голову над запросом, тем более что SQL язык для выбора опеределенных звписей, а не екважно каких, лишь бы их проредить, причем слегда.
Самое главное, непонятно зачем?
-
Информация поступает с разной периодичностью, а отправлять пользователям надо: кому 1 запись по каждому Id в два часа, кому 1 запись в 6 часов.
-
>Помогите, пожалуйста. можно подробнее пояснить, что всё-же хочется?
-
>Раиса © (17.04.08 11:36) [2] отсылать ближайшую к началу периода запись по каждому id?
-
Да уж, кто-то точно "захлкбнется" информацией - два десятка строк за сутки вместо гарантироанных конститутуцией 4х! А ответственность за то что в пропущенных строках была наиболее важная информация, чем в предоставленной ты берешь на себя?
a "нормальный" - уникальный для каждой записи - Id в таблице есть?
-
Может её лучше не в виде грида пользователю показывать, а виде графков?
-
Есть и поле Identity в таблице, и Id, по которому надо отбирать в нужном диапазоне. Ответственность за пропущеннные записи беру на себя.
-
>Раиса © (17.04.08 12:00) [7] ответы будут?
-
> Т.е. должно получиться типа:
а критерий отбора?
-
В заданном диапазоне (например 2 часа) выбирается 1 запись, ближайшая по времени. Пример приведен выше из выборки. Мне непонятно, что непонятно вам. Критерий сформулировать сложно.... хотя запрос-то мне помогла написать колллега...но уверенности нет....
-
> Раиса © (17.04.08 15:03) [10] > В заданном диапазоне (например 2 часа) выбирается 1 запись, > ближайшая по времени.
Диапазон задается не продолжительностью, а началом и концом. Вот и формулируй критерий выборки соответственно... И лучше в максимально формализованном виде.
-
Группирование по 2 часам делается путем умножения dt на 12 и приведением к целому
-
Anatoly Podgoretsky © (17.04.08 16:13) [12] Да, идея, предложенная мне моей коллегой, близка к вашему предложению.
-
> Раиса (17.04.2008 16:43:13) [13]
У меня не только предложение, у меня эта техника используется для групирования интервалов по 5 минут, константа равна 24*12, что еще лучше можно придуматьЮ как прямо получить эти интервалы в виде целого, по которому автоматически получается группировка. Я использую СУБД, которая позволяет выражения где угодно.
-
Вот мой запрос: select _id,dd,min(datetime) as datetime from (
select _id,
cast(convert(char(8),datetime,112)+' '+cast((datepart(hh,datetime)-datepart(hh,datetime) %2) as varchar(10))+':00:00' as datetime) as dd
,datetime
from ppp a
where curdatetime>='20080415'
and _id in (20028,20029)
) aa
group by _id,dd
order by _id,dd В качестве dd можно как Вы предложили: cast(cast(datetime as float)*24 as int) as dd . Anatoly Podgoretsky © (17.04.08 16:58) [14] А пример Вашего работающего запроса можно?
-
> Раиса (17.04.2008 17:14:15) [15]
Мне его уже не найти, там где он использовался, уже работает другая технология, которая тоже уже убита. Но это что то подобное этому GROUP BY cast(Fld * 288 AS Integer) ORDER BY Fld * 288
|