[SQL] выбрать прямоугольник данных

Maurog

есть данные в одной таблице с двумя параметрами, которые можно упорядочивать. можно представить, что это координаты x, y точек на плоскости (дискретный случай): x > 0, y > 0, конечное число точек
надо выбрать точки
1) в условиях ограничения по горизонтали (не более 10 точек и\или точки, не дальше, чем 10 км)
2) без ограничений по вертикали, то есть точки во всех вертикалях необходимо захватить
3) зона выбора должна быть связной областью, ну или в пункте 1) 10 точек не должны содержать дыр по горизонтали (без пропуска других точек)
4) порядок выхлопа неважен
нужны ключевые слова для построения SQL запроса в mysql, можно наброски самого запроса
от запроса требуется простота для начала, но и не слишком тормозить. точек будет порядка 1 - 5 M, область вытянута по горизонтали, точки только добавляются (исторические данные)

SergeRRRRRR

брр, написал бы какие столбцы, что в них и тп и тд.

mbolik1

Я перестал понимать отсюда:
3) зона выбора должна быть связной областью, ну или в пункте 1) 10 точек не должны содержать дыр по горизонтали (без пропуска других точек)
0<x<10, y>0 — это свзяная область. Но ты видимо имеешь ввиду что-то другое.

Teteshnik

не повезло с базой http://habrahabr.ru/post/43955/

vic-sher

Я запутался уже на 1)
10 км от чего нужно мерять?

kill-still

не повезло с базой http://habrahabr.ru/post/43955/
NSM придумали лузеры? :confused:

Maurog

0<x<10, y>0 — это свзяная область. Но ты видимо имеешь ввиду что-то другое.
это и имеется в виду
попробую переформулировать задачу: надо в каждой горизонтали отрезать хвост и включить первые 10 точек
иллюстрация:

hprt

row_number over (partition by y order by x)
Этого нет в mysql, но способов эмуляции много - поищи и выбери оптимальный для себя

Maurog

Этого нет в mysql, но способов эмуляции много
судя по http://explainextended.com/2009/03/08/analytic-functions-sum... лучше не эмулировать, себе дороже выйдет :(

hprt

способов действительно много можно придумать. Посмотри другие, может приемлимы будут. В конце концов можно каждый раз выбирать минимальный х из тех, что еще не в наборе - гарантированный результат за 10 проходов

Maurog

кстати, нагуглилось

SELECT p1.*
FROM Points p1
LEFT OUTER JOIN Points p2
ON (p1.y = p2.y AND p1.x < p2.x)
GROUP BY p1.x
HAVING COUNT(*) < 10;

отсюда

hprt

ну, вариантов так сделать действительно много, я поэтому и посоветовал поискать самому и выбирать оптимальный для тебя, потому что оптимальность может зависеть много от чего. Объем данных, индексы и тд
Upd и это, не пиши никогда * c group by

Bibi

не пиши никогда *, особенно c group by
Оставить комментарий
Имя или ник:
Комментарий: