Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Составить запрос, Помогите составить запрос 
V
    Опции темы
rpv
Дата 1.3.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Здравствуйте!
Помогите пожалуйста составить запрос.
Есть таблица, где указано состояние приборов
Поля:
id - номер прибора
status - состояние прибора
statusdate - дата, когда изменилось состояние прибора
То есть id может повторяться
Нужно составить запрос, который возвратит состояние приборов на текущий момент. Мои мысли - сгруппировать приборы по id, посмотреть наибольшую дату изменения состояния прибора и на эту дату посмотреть состояние. Вот только такой запрос не могу придумать.
PM MAIL   Вверх
Magnifico
Дата 1.3.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



Код

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


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

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

select * from table
 where statusdate  =getdate()



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

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


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
rpv
Дата 1.3.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



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
PM MAIL   Вверх
Magnifico
Дата 1.3.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



я думал речь на милисекунды идет ,что я у тебя монитор в реальном времени
а ту просто выборка на последнюю существующую дату для каждого 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




--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
rpv
Дата 4.3.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Спасибо!

Это сообщение отредактировал(а) rpv - 4.3.2008, 11:56
PM MAIL   Вверх
Deniz
Дата 4.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



А что проще нельзя?
Код

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



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Magnifico
Дата 9.3.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 1
Всего: 17



да проще но только в написании 

добавим 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


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


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Deniz
Дата 11.3.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.