Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос самых свежих записей архива  [new]
ichiban
Guest
Здравствуйте

У меня есть таблицы архивов показаний приборов следующего вида: ID записи, ID прибора, Дата, Показания.
Нужно сделать таблицу с последними значениями по всем приборам (ну или нулами, если по конкретному девайсу в базе ничего нет).

Раньше, для себя, делал курсор из таблицы приборов, и для каждого искал максимальную дату, записывая полученные значения в новую таблицу. Сейчас эта процедура будет выполняться чаще, плюс приборов все больше, боюсь что в скором времени курсор будет сильно тормозить.
Попробовал дистинктом:
SELECT DISTINCT(ID_Unit), Date_Time FROM tbl_ArcDays

- получилась ерунда. Выводит всю таблицу. Максимальную дату искать уже не стал, ибо выводил он всю таблицу, не оставляя по одному ID_Unit..

Помогите пжалста разобраться..
9 июн 12, 09:48    [12692163]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
SELECT
  *
FROM
  tbl_Units U
  OUTER APPLY
  (SELECT TOP 1
     *
   FROM
     tbl_ArcDays A
   WHERE
     A.ID_Unit = U.ID
   ORDER BY
     A.Date_Time DESC) Q


Сообщение было отредактировано: 9 июн 12, 09:58
9 июн 12, 09:57    [12692243]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ichiban, что-то в этом духе
+

;with zz
as
(
select *,row_number() over (partition by ID_Unit order by Date_Time desc ) rn
from tbl_ArcDays
)

select top 1 with ties * 
from zz
order by rn 

/*or*/

select * 
from zz
where rn=1

9 июн 12, 09:57    [12692246]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
ichiban
Guest
Виноват, не указал что у меня mssql2000..

pkarklin, впервые вижу оператор Apply, в BOL тоже чет не встретил.. Гугль вроде сказал что он в 2005-м только появился..
QA ругается на синтаксис возле аутер, думаю это о нем..


denis2710, говорит что не знает функцию row_number()




ps судя по всему простым дистинктом тут не обойтись))
9 июн 12, 10:42    [12692575]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
Добрый Э - Эх
Guest
ichiban,

читай до просветления: тынц

Большая часть вариантов пойдет и на 2000-м сервере.
9 июн 12, 10:45    [12692600]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
ichiban
Guest
стрелять колотить!
Спасибо огромное!!)))
Уже просветляюсь!:)
9 июн 12, 10:49    [12692614]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ichiban,
ну надеюсь есть табличка со списком все приборов.
ну для 2К можно попробовать что-то в этом духе
select t.ID_Unit
,q.*
from(
select
ID_Unit
,(select top 1 ID_Record
from tbl_ArcDays z
where z.ID_Unit = a.ID_Unit
order by   Date_Time  desc) as ID_Record
from tableDevice a/*таблица с девайсами*/
) t
left outer join tbl_ArcDays q on q.ID_Record = t.ID_Record
9 июн 12, 10:50    [12692617]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
ichiban
Guest
Только хотел написать Э -Эх'у что все работает и спасибо, что таблицу последний записей выдает, а уж склеить её с таблицей всех приборов и заnullить оставшиеся проблем нет, как увидел сообщение denis2710, которое хоть и менее мне понятно, но таки делает вообще все))


всем спасибо, проблема решена!=)
9 июн 12, 11:06    [12692695]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
MegaStar
Guest
Доброго времени суток!
Скажите, а как вывести не одну, а несколько последних записей для каждого ID?

Попробовал курсором - долго получается
13 ноя 12, 03:15    [13462403]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
Добрый Э - Эх
Guest
MegaStar,

Версия сервера какая? Если 2005 или выше, то использовать варианты с ROW_NUMBER-ом, задавая ограничение rn = N (где N - нужное кол-во записей), либо top N with ties (но в этом случае есть тонкость с передачей в запрос значения N)
13 ноя 12, 04:24    [13462422]     Ответить | Цитировать Сообщить модератору
 Re: Запрос самых свежих записей архива  [new]
MegaStar
Guest
Добрый Э - Эх, большое спасибо за ответ!

Но я подумал, что лучше будет новое поле ввести в исходной таблице, чем запрос делать.. Записей в таблице из которой нужно было эти "списки" вытащить довольно много, так что в любом случае запрос будет времени требовать..

В общем спасибо, что не прошли мимо, вопрос свой снимаю))
13 ноя 12, 04:44    [13462429]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить