Конференция "Базы" » Выбрать записи ближайшие к определенному интервалу [D7, MSSQL]
 
  • Раиса © (17.04.08 11:09) [0]
    Есть таблица (ниже приведены 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
    и т.д.

    Помогите, пожалуйста.
  • ЮЮ © (17.04.08 11:32) [1]
    гораздо проще пробежаться по курсору, чем ломать голову над запросом, тем более что SQL язык для выбора опеределенных звписей, а не екважно каких, лишь бы их проредить, причем слегда.

    Самое главное, непонятно зачем?
  • Раиса © (17.04.08 11:36) [2]
    Информация поступает с разной периодичностью, а отправлять пользователям надо: кому 1 запись по каждому Id в два часа, кому 1 запись в 6 часов.
  • Кщд (17.04.08 11:37) [3]
    >Помогите, пожалуйста.
    можно подробнее пояснить, что всё-же хочется?
  • Кщд (17.04.08 11:38) [4]
    >Раиса ©   (17.04.08 11:36) [2]
    отсылать ближайшую к началу периода запись по каждому id?
  • ЮЮ © (17.04.08 11:51) [5]
    Да уж, кто-то точно "захлкбнется" информацией - два десятка строк за сутки вместо гарантироанных конститутуцией 4х!
    А ответственность за то что в пропущенных строках была наиболее важная информация, чем в предоставленной ты берешь на себя?

    a "нормальный" - уникальный для каждой записи - Id в таблице есть?
  • ЮЮ © (17.04.08 11:57) [6]
    Может её лучше не в виде грида пользователю показывать, а виде графков?
  • Раиса © (17.04.08 12:00) [7]
    Есть и поле Identity в таблице, и Id, по которому надо отбирать в нужном диапазоне.
    Ответственность за пропущеннные записи беру на себя.
  • Кщд (17.04.08 13:18) [8]
    >Раиса ©   (17.04.08 12:00) [7]
    ответы будут?
  • Павел Калугин © (17.04.08 13:26) [9]

    > Т.е. должно получиться типа:


    а критерий отбора?
  • Раиса © (17.04.08 15:03) [10]
    В заданном диапазоне (например 2 часа) выбирается 1 запись, ближайшая по времени. Пример приведен выше из выборки.
    Мне непонятно, что непонятно вам. Критерий сформулировать сложно.... хотя запрос-то мне помогла написать колллега...но уверенности нет....
  • Johnmen © (17.04.08 15:12) [11]

    > Раиса ©   (17.04.08 15:03) [10]
    > В заданном диапазоне (например 2 часа) выбирается 1 запись,
    >  ближайшая по времени.

    Диапазон задается не продолжительностью, а началом и концом.
    Вот и формулируй критерий выборки соответственно...
    И лучше в максимально формализованном виде.
  • Anatoly Podgoretsky © (17.04.08 16:13) [12]
    Группирование по 2 часам делается путем умножения dt на 12 и приведением к целому
  • Раиса © (17.04.08 16:43) [13]
    Anatoly Podgoretsky ©   (17.04.08 16:13) [12]
    Да, идея, предложенная мне моей коллегой, близка к вашему предложению.
  • Anatoly Podgoretsky © (17.04.08 16:58) [14]
    > Раиса  (17.04.2008 16:43:13)  [13]

    У меня не только предложение, у меня эта техника используется для групирования интервалов по 5 минут, константа равна 24*12, что еще лучше можно придуматьЮ как прямо получить эти интервалы в виде целого, по которому автоматически получается группировка. Я использую СУБД, которая позволяет выражения где угодно.
  • Раиса © (17.04.08 17:14) [15]
    Вот мой запрос:

    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]
    А пример Вашего работающего запроса можно?
  • Anatoly Podgoretsky © (17.04.08 18:59) [16]
    > Раиса  (17.04.2008 17:14:15)  [15]

    Мне его уже не найти, там где он использовался, уже работает другая технология, которая тоже уже убита.
    Но это что то подобное этому GROUP BY cast(Fld * 288 AS Integer) ORDER BY Fld * 288
 
Конференция "Базы" » Выбрать записи ближайшие к определенному интервалу [D7, MSSQL]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]