powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос (маленькая поправочка).
13 сообщений из 13, страница 1 из 1
Помогите написать запрос (маленькая поправочка).
    #32042409
Алексeй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть таблица со структурой Vn (int) - идентификатор устр-ва, Measure(DateTime) - дата измерения, Val (smallmoney) - измеренное значение.
В ней имеются данные
Vn Measure Val
1 01.01.2002 100.00
2 01.01.2002 200.00
3 01.01.2002 300.05
1 02.01.2002 101.00
2 03.01.2002 202.00
3 04.01.2002 303.05
1 05.01.2002 105.00
2 05.01.2002 207.00
3 05.01.2002 308.05
Как мне написать такой запрос, чтобы он вернул только записи с максимальной датой до 05.01.2002, т.е с датой < 05.01.2002? Т.е мне нужно чтобы запрос выдал только следующие записи :

1 02.01.2002 101.00
2 03.01.2002 202.00
3 04.01.2002 303.05

Дело в том, что данные по разным устройствам могут приходить в разное время.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042412
Olga3891
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT *
FROM "ИМЯ ТАБЛИЦЫ"
WHERE Measure<'05.01.2002'
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042413
Фотография KIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * from TABLE
where Measure>='20020102' AND Date<'20020105'
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042419
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
select Vn,max(Measure) as Measure,max(Val) as Val from Table t 
group by Vn
having max(Measure)< 05 . 01 . 2002 

кажись так, если правильно понял задачу
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042432
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
звиняюсь за прошлый неверный ответ, прочитал вопрос еще раз. Вот так можно:
select *
from MyTable, (select Vn,Max(Measure) from MyTable
where Measure<'05.01.2002' group by Vn) as TT(Vn,Measure)
where MyTable.Vn=TT.Vn and MyTable.Measure=TT.Measure
Должно работать.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042436
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT *
FROM MyTable
WHERE Measure = (SELECT MAX(Measure) FROM MyTable WHERE Measure < '05-01-2002')
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042438
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dominic, специально для тебе накарябал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
set dateformat dmy

create table #tmV(Vn int, Measure DateTime, Val smallmoney )

insert into #tmV(Vn, Measure, Val)
values( 1 ,'01.01.2002', 100 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 2 ,'01.01.2002', 200 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 3 ,'01.01.2002',  300 . 05 ) 
insert into #tmV(Vn, Measure, Val)
values( 1 ,'02.01.2002',  101 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 2 ,'03.01.2002',  202 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 3 ,'04.01.2002',  303 . 05 ) 
insert into #tmV(Vn, Measure, Val)
values( 1 ,'05.01.2002',  105 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 2 ,'05.01.2002',  207 . 00 ) 
insert into #tmV(Vn, Measure, Val)
values( 3 ,'05.01.2002',  308 . 05 )

select * from #tmV

 --посмотри что вернет твой запрос
 
SELECT * 
FROM #tmV 
WHERE Measure = (SELECT MAX(Measure) FROM #tmV WHERE Measure < '05.01.2002')


 --а теперь, КАК было нужно 
 
select #tmV.* from #tmV,
(select Vn,Max(Measure)
from #tmV
where Measure<'05.01.2002'
group by Vn) as TT(Vn,Measure)
where #tmV.Vn=TT.Vn and #tmV.Measure=TT.Measure

 -- и сравни с требуемым ответом
 
drop table #tmV

Запусти в QA и посмотри результат.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042441
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пошутил! Я пошутил!

SELECT *
FROM MyTable T1
WHERE Measure = (SELECT MAX(Measure) FROM MyTable WHERE Measure < '05-01-2002' AND Vn = T1.Vn)

Если в таблице несколько сот тысяч записей... Наверное, быстрее выполнялось бы так (в батче):

SELECT Vn, MAX(Measure) INTO #temp
FROM MyTable
GROUP BY Vn

SELECT #temp.Vn, #temp.Measure, Val
FROM #temp INNER JOIN MyTable
ON #temp.Vn = MyTable.Vn AND #temp.Measure = MyTable.Measure

По крайней мере на семерке шустрее шло, а в 2000 как там оптимизатор с подчиненными запросами работает - не знаю...
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042447
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага, последний пример краше.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042458
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дружище ~Bazul~, не шуми. Что мой подчиненный запрос, что твой вложенный - те же яйца (куриные), только в профиль.
А насчет последнего примера, в твоей оценке которого я уловил иронию, то я не поленился сравнить производительность моей "временной таблицы" с твоим вложенным запросом на "боевых" данных (сопровождаю тут одну систему, собравшей за 3 года 4 млн. результатов химических анализов). Увы, "временная таблица" работает на 25% быстрее.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32042488
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я про твой последний код и говорю, что он краше ,чем предложенный мной.
Увы, "временная таблица" работает на 25% быстрее.
Это и понятно- два простых запроса, работают быстрее одного сложного(со вложенными подзапросами). Я стараюсь не загружать оптимизатор, и по мере возможности тоже пользуюсь временными таблами.
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32046014
Dvorez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно и так:

set dateformat dmy

create table #tmV(Vn int, Measure DateTime, Val smallmoney )

insert into #tmV(Vn, Measure, Val)
values(1,'01.01.2002',100.00)
insert into #tmV(Vn, Measure, Val)
values(2,'01.01.2002',200.00)
insert into #tmV(Vn, Measure, Val)
values(3,'01.01.2002', 300.05)
insert into #tmV(Vn, Measure, Val)
values(1,'02.01.2002', 101.00)
insert into #tmV(Vn, Measure, Val)
values(2,'03.01.2002', 202.00)
insert into #tmV(Vn, Measure, Val)
values(3,'04.01.2002', 303.05)
insert into #tmV(Vn, Measure, Val)
values(1,'05.01.2002', 105.00)
insert into #tmV(Vn, Measure, Val)
values(2,'05.01.2002', 207.00)
insert into #tmV(Vn, Measure, Val)
values(3,'05.01.2002', 308.05)

select #tmV.* from #tmV,
(select Vn,Max(Measure) as Measure
from #tmV
group by Vn) as TT
where #tmV.Vn=TT.Vn and #tmV.Measure=TT.Measure


drop table #tmV
...
Рейтинг: 0 / 0
Помогите написать запрос (маленькая поправочка).
    #32049570
GMT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GMT
Гость
Select v.* from mtable as v
inner join
( select vn, max(measure) from mtable group by Vn where measure <'05.01.2002') as v1
on (v.vn=v1.vn) and (v.measure= v1.measure )
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос (маленькая поправочка).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]