[SQL] для каждого datetime получить строку с минимальным N?

grek72

Есть вьюха, которая возвращает:
 
DateTime1               N       DateTime2               RN
2006-01-10 10:30:00.000 42 2006-01-10 10:30:42.000 1
2006-01-10 10:30:00.000 46 2006-01-10 10:30:46.000 2
2006-01-10 10:30:00.000 52 2006-01-10 10:30:52.000 3
2006-01-10 10:30:00.000 54 2006-01-10 10:30:54.000 4
2006-01-10 10:30:00.000 60 2006-01-10 10:31:00.000 5
2006-01-10 10:30:00.000 75 2006-01-10 10:31:15.000 6
2006-01-10 10:30:00.000 87 2006-01-10 10:31:27.000 7
2006-01-10 10:35:00.000 129 2006-01-10 10:32:51.000 8
2006-01-10 10:35:00.000 21 2006-01-10 10:34:39.000 9
2006-01-10 10:35:00.000 13 2006-01-10 10:34:47.000 10
2006-01-10 10:40:00.000 42 2006-01-10 10:40:42.000 11
2006-01-10 10:40:00.000 78 2006-01-10 10:41:18.000 12
2006-01-10 10:40:00.000 103 2006-01-10 10:41:43.000 13
2006-01-10 10:45:00.000 132 2006-01-10 10:42:48.000 14
2006-01-10 10:45:00.000 115 2006-01-10 10:43:05.000 15
2006-01-10 10:45:00.000 109 2006-01-10 10:43:11.000 16
2006-01-10 10:45:00.000 85 2006-01-10 10:43:35.000 17
2006-01-10 10:45:00.000 60 2006-01-10 10:44:00.000 18
2006-01-10 10:45:00.000 58 2006-01-10 10:44:02.000 19
2006-01-10 10:45:00.000 43 2006-01-10 10:44:17.000 20
2006-01-10 10:45:00.000 19 2006-01-10 10:45:19.000 21
2006-01-10 10:45:00.000 80 2006-01-10 10:46:20.000 22
2006-01-10 10:45:00.000 85 2006-01-10 10:46:25.000 23
2006-01-10 10:50:00.000 149 2006-01-10 10:47:31.000 24

надо выбрать для каждого уникального значения DateTime1 строку с минимальным N.

tashka

//здесь был неправильный запрос

pitrik2

кстати
а в MSSQL тоже стоит ограничение на количество результатов внутри IN?
а то если таблица большущая, то такой запрос свалится в оракле

artimon

select x.* from x left join x as y on (x.DateTime1 = y.DateTime1 and x.N > y.N) where y.N is null;

http://xpoint.ru/forums/computers/dbms/mysql/thread/30111.xh...

laki

в таблице 9 миллионов

Dasar

> а то если таблица большущая, то такой запрос свалится в оракле
не правда!
в oracle есть ограничение на кол-во expession-ов, но не кол-во записей.
соответственно, если писать так:
select * from where a in ('a', 'b', 'c' и т.д то сработает ограничение,
если писать так
select * from where a in (select a from чего-то там) то никаких ограничений не будет

pitrik2

странно
я как то писал такой запрос, он свалился
правда, я не стал разбираться почему
может там чего с памятью...
еще раз попадется, обязательно изучу вопрос

grek72

Всем спасибо, в понедельник попробую.

Papazyan

странно
я как то писал такой запрос, он свалился
правда, я не стал разбираться почему
может там чего с памятью...
Я такой использовал. Элементов в in было тыщ 20-40.

wwoland

а это не то же самое, случаем?

6yrop

SELECT ID,N
FROM Query
WHERE N IN
(
SELECT MIN(N)
FROM Query
GROUP BY DateTime1
)
че то бред какой-то, этот запрос вернет не то что надо, ты наверное хотел что-то типа
 

SELECT T1.*
FROM
T1
INNER JOIN
(
SELECT DateTime1, MIN(N) as MaxN
FROM T1
GROUP BY DateTime1
) T2
ON T1.DateTime1 = T2.DateTime1
AND T1.N = T2.MaxN

с этим тоже небольшая проблема, если запесей с минимальным значением несколько. Либо в подзапросе с помощью MIN/MAX выбирать остальные поля, либо нумеровать строки (ROW_NUMBER) но это лишняя сортировка.

0000

Может я что то не так понял, но разве вот такой запросец не будет самым простым

select distinct DateTime1, min (N) over (partition by DateTime1) from Вьюха

?

6yrop

там надо всю строку

grek72

круто!
всё работает, спасибо!

shadow_sonic

соответственно, если писать так:
select * from where a in ('a', 'b', 'c' и т.д то сработает ограничение,
если писать так
select * from where a in (select a from чего-то там) то никаких ограничений не будет
я помню у меня был огромный список кодов в екселе по которым надо было вытащить, я писал ещё в таком виде (креэйтнуть таблицу кодов и слить туда возможности не было):
select * from where a in (код1,код2, код3, ..., кодN)
or a in (кодN+1, кодN+2, ..., кодN+N)
or и т.д.

0000

А я вот так

select Код1 from dual
union
...
union
select КодN from dual

Оставить комментарий
Имя или ник:
Комментарий: