Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Составить запрос


Автор: rpv 1.3.2008, 11:43
Здравствуйте!
Помогите пожалуйста составить запрос.
Есть таблица, где указано состояние приборов
Поля:
id - номер прибора
status - состояние прибора
statusdate - дата, когда изменилось состояние прибора
То есть id может повторяться
Нужно составить запрос, который возвратит состояние приборов на текущий момент. Мои мысли - сгруппировать приборы по id, посмотреть наибольшую дату изменения состояния прибора и на эту дату посмотреть состояние. Вот только такой запрос не могу придумать.

Автор: Magnifico 1.3.2008, 12:49
Код

select * from table
 where statusdate in
(
select  max(statusdate)
from table
)


Добавлено через 13 минут и 34 секунды
ой наврал блин!
этот запрос получает значения каждого счетчика на последнюю(максимальную дату)
но не на текущий момент (а если счетчик не работал минуту?)

может так (сравнивать с текущим временем)
Код

select * from table
 where statusdate  =getdate()



и гуппировка не нужна если запись добавлятся каждую секунду

функция getdate() для sql server или аналогичная для других субд

Автор: rpv 1.3.2008, 17:17
To Magnifico:

Вас запрос возвращает всего одну строку. Может я мало информации дал...

Таблица такого вида

id          status               statusdate
1           1           2007-01-01 00:00:00.000    
2           1           2007-01-01 00:00:00.000    
2           2           2007-01-02 00:00:00.000    
3           1           2007-01-01 00:00:00.000    
4           1           2007-01-01 00:00:00.000    

Как видно из таблицы, на приборе с id=2 01.01.2007 состояние равно 1, а на следующий день состояние изменилось на 2, то есть на текущий момент состояние равно 2. Мне нужно получить в результате запроса табличку вида:
id    status
1         1
2         2
3         1
4         1

Добавлено через 2 минуты и 26 секунд
To Magnifico:

Вас запрос возвращает всего одну строку. Может я мало информации дал...

Таблица такого вида

id          status               statusdate
1           1           2007-01-01 00:00:00.000    
2           1           2007-01-01 00:00:00.000    
2           2           2007-01-02 00:00:00.000    
3           1           2007-01-01 00:00:00.000    
4           1           2007-01-01 00:00:00.000    

Как видно из таблицы, на приборе с id=2 01.01.2007 состояние равно 1, а на следующий день состояние изменилось на 2, то есть на текущий момент состояние равно 2. Мне нужно получить в результате запроса табличку вида:
id    status
1         1
2         2
3         1
4         1

Автор: Magnifico 1.3.2008, 22:23
я думал речь на милисекунды идет ,что я у тебя монитор в реальном времени
а ту просто выборка на последнюю существующую дату для каждого id

Код

--------Transact SQL-----------------
declare @table table
(
id int,
status int,
statusdate datetime
)
-------------------------------------
insert @table
select 1,1 ,'2007-01-01 00:00:00.000'
union all
select 2,1 , '2007-01-01 00:00:00.000'
union all
select 2,2,  '2007-01-02 00:00:00.000'
union all
select 3 ,1 , '2007-01-01 00:00:00.000'
union all
select 4 ,2 , '2007-01-01 00:00:00.000'
union all
select 4 ,1 , '2007-01-02 00:00:00.000'
union all
select 4 ,3 , '2007-01-03 00:00:00.000'
union all
select 4 ,2 , '2007-01-04 00:00:00.000'
--------------------------------------------
select t1.id,t1.status
from @table as t1
join
(select id,max(statusdate) as statusdate
from @table
group by id) as t2
on t1.statusdate = t2.statusdate and t1.id = t2.id
order by t1.id


Автор: rpv 4.3.2008, 11:55
Спасибо!

Автор: Deniz 4.3.2008, 12:45
А что проще нельзя?
Код

select t1.* from table t1
 where t1.statusdate in
(
  select  max(t2.statusdate) from table t2 where t2.id = t1.id
)

Автор: Magnifico 9.3.2008, 16:54
да проще но только в написании 

добавим order by

Код

select t1.* from table t1
 where t1.statusdate in
(
  select  max(t2.statusdate) from table t2 where t2.id = t1.id

)
order by t1.id


план выплнения будет практчески одинаковый

Автор: Deniz 11.3.2008, 07:32
Magnifico, проще не только в написании, но и в использовании.
У тебя использован T-SQL, который есть не везде  smile, но раз и так помогло, то и хорошо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)