2013-02-22 2 views
1

Я должен классифицировать данные на основе даты и времени, исходя из 15-минутного интервала, 30-минутного интервала и 1 часа. Я написал запрос, как это в течение 1 часа слота,Как получить верхнюю запись с интервалом каждые 15 минут?

select 
    a.datetime, feederid, 
    vr, vy, vb 
from (
    select datetime,feederid, vr, vy, vb, tt, DENSE_RANK() OVER (
     partition by dateadd(hour, datediff(hour, 0, datetime), 0), feederid 
     ORDER BY feederid,datetime 
    ) rank1 
    from pseb.dbo.datasource 
    where 
    convert(datetime,datetime) between '2011-06-12' and '2011-06-12 23:59:00' 
) a 
where rank1 = 1 

, но я не знаю, как разделить данные в течение 15 минут значений слотов.

Моя таблица ResultSet подобна этой

DATETIME   FeederID VR  VY VB 
    2011-06-12 00:09:50 4731 199.148 0 212.69 
    2011-06-12 00:05:31 4731 178.531 0 242.838 
    2011-06-12 00:36:20 4731 174.622 0 239.756 
    2011-06-12 01:10:03 4731 175.645 0 240.328 
    2011-06-12 13:10:07 4731 196.387 76.991 241.798 
    2011-06-12 18:35:46 4731 207.719 54.756 251.855 

здесь 00:00 до 15:00 минут слот есть 2 записи, мне нужен верхний 1 заказ на даты и времени по алфавиту.

Помогите мне это сделать.

+1

Я могу написать этот запрос для вас. Я плачу 100 долларов за час с минимальным выписанным временем в два часа, оплаченным авансом. У вас есть Paypal? – 2013-02-22 06:32:13

+0

@Saranya: downvotes по этому вопросу являются результатом того, что они не пытались решить ее самостоятельно. Вопросы здесь должны содержать подробную информацию о том, что вы пытались, что произошло и что вы ожидали. – halfer

+1

Отлично! Отредактируйте этот комментарий в свой вопрос, и в следующий раз, когда вы что-то спросите, не забудьте добавить такой же уровень детализации ':)'. Кроме того: у меня есть руководство «как задавать вопросы», связанное в моем профиле, что может вас заинтересовать. – halfer

ответ

2

Либо используйте функцию окон или группу. Настоящий трюк заключается в использовании ключа сортировки в 15-минутном окне.

Select * from 
    (
    Select 
     dateadd(
     second, -1 * datepart(second, datetime) 
     , dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime) 
    ) 
     , feederid, vr, vy, vb 
     , rank() over (
     partition by dateadd(
      second 
      , -1 * datepart(second, datetime) 
      , dateadd(minute, mod(datepart(minute, datetime),15) * -1, datetime) 
     ) order by datetime desc 
    ) rnk 
    ) where rnk = 1 
+0

Спасибо Джеффри, у меня была идея использовать функцию ранга, но я не знаю, как разделить эти значения datetime. теперь я узнаю .. :) –

1

Вы должны сначала извлечь все записи в пределах слота пятнадцать минут и порядка их с помощью DateTime столбца с помощью DESC и установить ограничение 1, чтобы вернуть верхний ряд из выбранных строк больше о пределах смотреть на http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

http://www.w3schools.com/sql/sql_top.asp

2

Во-первых, это скромный запрос, чтобы быть точным и более глубоко объяснить вашу проблему.

Тем не менее, я дал решение по вашему вопросу. попробуйте этот. Пожалуйста, сообщите, работает ли он или нет?

declare @s datetime 
select @s=(SELECT 
CONVERT(VARCHAR(8),GETDATE(),108) AS HourMinuteSecond 
) 
print @s 
select top 1 * from tablename where m like @s group by datetime desc 
Смежные вопросы