|
Как исключить лишние симметричные пары из таблицы? | ☑ | ||
---|---|---|---|---|
0
Powerfool
13.02.15
✎
11:49
|
У меня вопрос как раз для пятницы. Точней вопроса даже два:
1. У меня есть пачка объектов в БД. Мне нужно их сравнить попарно каждый с каждым. Если делать это программно перебором (пусть даже с минимальным количеством операций сравнения) получится хренова гора операций (больше миллиона). Я вот думаю сделать такой запрос в котором я буду получать все пары из нижнего треугольника матрицы попарного сравнения, тоесть Матрица О1 О2 О3 О1 x11 x12 x13 О2 x21 x22 x23 О3 x31 x32 x33 А я хочу получить таблицу O2 O1 x21 O3 O1 x31 O3 O2 x32 Сравнивать объект сам с собой не будем + сравнение объектов - это симметрическая операция мне нужны только x21, а x12 не нужен ибо x21 = x12. Запрос не ваяется, пятница однако. Тех кто заинтересовался, жду от Вас че нить дельное. Второй вопрос вообще про вынос мозга. Мне надо посчитать сложные мат.функции с этими данными (sin, cos, asin). С языком запросов это сделать, увы, никак. Но это есть в СКД. Я представляю это так: запрос отрабатывает отдает таблицу в скд, там происходит добавление выч.поля с этими функциями и выгрузка этого поля из скд. Это ваще как? Как это сделать программно? Кто такое делал? Где о таких извращениях пишут? ЗЫ Была грешная мысль разложить функции в ряды, но это как то не комильфо. |
|||
1
Волшебник
модератор
13.02.15
✎
11:51
|
Сделай программно перебором и не люби нам мозг.
|
|||
2
Powerfool
13.02.15
✎
11:53
|
(1) Это вопрос для любителей мозга. Не любителям мозга просьба не беспокоить.
В свою защиту скажу: такой перебор считает четыре часа, что больно уж дофига. Надо ускорить |
|||
3
Cube
13.02.15
✎
11:54
|
(0) "Запрос не ваяется"
Что не получается? |
|||
4
Cube
13.02.15
✎
11:56
|
По второму вопросу: если ты первый вопрос сделаешь в запросе, то суй запрос в СКД, считай свое поле и результат из СКД выводи в ТЗ...
|
|||
5
Лодырь
13.02.15
✎
11:57
|
Сравнение происходит типовой операцией сравнения или хитрой функцией?
|
|||
6
Powerfool
13.02.15
✎
11:58
|
(4) Я так никогда не делал, может есть где почитать как это делают другие?
|
|||
7
Powerfool
13.02.15
✎
11:59
|
(3) В мозгу уместить не могу как отобрать такие комбинации. Хотя мыслишка есть, я поправляюсь в (0). Запрос ваяется но туго. Как сделаю отпишусь
|
|||
8
Лодырь
13.02.15
✎
11:59
|
(6) ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений тебе в помощь
|
|||
9
Powerfool
13.02.15
✎
12:00
|
(5) Объекты это точки на карте, у них есть широта и долгота. Мне нужны все уникальные пары сочетаний объектов (то есть те у которых широте и долгота отличаются)
|
|||
10
Powerfool
13.02.15
✎
12:00
|
(8) ппц 1с в своем духе. Я пока это слово дочитал устал
Спасибо буду курить |
|||
11
Лодырь
13.02.15
✎
12:01
|
(9) А зачем тебе их сравнивать? Если тебе нужны лишь уникальные комбинации?
|
|||
12
Powerfool
13.02.15
✎
12:04
|
(11) Не совсем вопрос понял. Может я вопрос не правильно поставил? Если по твоему то: "Как получить уникальные комбинации?"
|
|||
13
Лодырь
13.02.15
✎
12:07
|
(12)
ВЫБРАТЬ РАЗЛИЧНЫЕ ТабДанных.Х, ТабДанных.Y ИЗ &ТабДанных КАК ТабДанных |
|||
14
Powerfool
13.02.15
✎
12:07
|
(11) Кажись дошло что ты сказал. Сравнивать не по координатам а по ссылкам надо! Дельная мысль, мерси
|
|||
15
Лодырь
13.02.15
✎
12:09
|
(14) моя твоя не понимай
|
|||
16
Powerfool
13.02.15
✎
12:09
|
(13) В твоем примере он выберет вообще всех
O1 O1 O1 O2 O1 O3 O2 O1 O2 O2 O2 O3 O3 O1 O3 O2 O3 O3 |
|||
17
Escander
13.02.15
✎
12:10
|
определитель матрицы ещё никто запросом не пробовал считать?
|
|||
18
Powerfool
13.02.15
✎
12:11
|
(17) Вооот уже вижу пятничное настроение у людей. Я сам сижу парюсь и потихоньку про себя ржу
|
|||
19
Cube
13.02.15
✎
12:13
|
(9) ВЫБРАТЬ РАЗЛИЧНЫЕ, не?
|
|||
20
FIXXXL
13.02.15
✎
12:14
|
> Мне нужны все уникальные пары сочетаний объектов (то есть те у которых широте и долгота отличаются)
сделать в одну строку ДолготаШирота, строку сгруппировать и количество вывести в суммируемом поле ну или (19) |
|||
21
Powerfool
13.02.15
✎
12:14
|
(19) читай (16)
|
|||
22
Cube
13.02.15
✎
12:14
|
(16) Давай мини пример
|
|||
23
hhhh
13.02.15
✎
12:15
|
(18) это что-то у вас само сравнение левое какое-то. Медленно выполняется. Вообще-то миллион операций - это для детского сада размеры. Обычно триллионы бывают, ну там изредка миллиарды.
|
|||
24
Powerfool
13.02.15
✎
12:15
|
(16) Мне надо чтоб так
O2 O1 O3 O1 O3 O2 |
|||
25
Лодырь
13.02.15
✎
12:15
|
(16) Догадаться сделать отбор сложно?
|
|||
26
Powerfool
13.02.15
✎
12:15
|
(22) (0)
|
|||
27
Powerfool
13.02.15
✎
12:16
|
(23) Я не правильно сказал. там не сравнение там вычисления (см. (0))
|
|||
28
Powerfool
13.02.15
✎
12:17
|
(25) Я чё в (0) непонятно написал? Сложно сделать отбор!! так лучше?
|
|||
29
FIXXXL
13.02.15
✎
12:20
|
(28) у тебя широта долготой может стать что ли?
пара Д-Ш уникальна? или равна такой же Ш-Д? |
|||
30
Powerfool
13.02.15
✎
12:22
|
(29) У меня есть таблица
O1 O2 O3 Мне надо получить запросом таблицу O2 O1 O3 O1 O3 O2 Или О1 О2 О1 О3 О2 О3 |
|||
31
Cube
13.02.15
✎
12:25
|
(26) Это фуфло. Делай запрос с вбитыми исходными данными, который запустится на любой конфе. И говори, какие он должен вернуть данные. А то я тебя не сильно понимаю...
|
|||
32
Powerfool
13.02.15
✎
12:27
|
(31) Новая формулировка задачи. Думаю понятнее уже не смогу объяснить
|
|||
33
Powerfool
13.02.15
✎
12:27
|
(32) Ссори я хотел вот так сделать
(31) Новая формулировка задачи в (30). Думаю понятнее уже не смогу объяснить |
|||
34
ShoGUN
13.02.15
✎
12:30
|
(33) В исходной таблице - числа?
|
|||
35
trad
13.02.15
✎
12:30
|
(0)
declare t table (x int, y int) insert into t select 0,0 union all select 1,2 union all select 1,5 union all select 2,1 union all select 3,8 union all select 4,0 union all select 5,6 union all select 9,2 select * from t as t1 join t as t2 on t2.x+t2.y*1000000 > t1.x+t1.y*1000000 order by t1.x, t1.y, t2.x, t2.y |
|||
36
Powerfool
13.02.15
✎
12:31
|
(34) Ссылки на объекты БД
|
|||
37
ShoGUN
13.02.15
✎
12:33
|
(36) По идее это JOIN таблицы с самой собой с условием > или <, так ты получишь только одну половину матрицы. См (35)
|
|||
38
ShoGUN
13.02.15
✎
12:35
|
Можно не извращаться с координатами, а просто ссылкам присвоить числовые индексы(или код взять).
|
|||
39
ShoGUN
13.02.15
✎
12:40
|
Чтоб на примере было понятно:
Исходная таблица: 1 2 3 При JOIN-е самой собой по условию "не равно": 1 2 1 3 2 1 2 3 3 1 3 2 Можно увидеть, что лишние пары можно отбросить, если не JOIN-ить с элементами с меньшим(или большим) значением(или индексом, пох). |
|||
40
Powerfool
13.02.15
✎
12:42
|
(39) Ну в обще то да, только вот индекс где взять. Использовать код справочника? Наверное это поможет, но не в общем случае (коды могут дублироваться). Ща опробирую
|
|||
41
AlexTim03
13.02.15
✎
12:44
|
(0) СКД программно вполне себе делается, там все можно сделать программно. Можно с нуля (с пустым макетом) собрать нужный отчет. Но для начала надо хотя бы поизучать книгу Хрусталевой той же
|
|||
42
ShoGUN
13.02.15
✎
12:44
|
(40) Можно выгрузить столбец ссылок, свернуть и взять номер строки. Но чистым запросом это не сделать.
|
|||
43
ShoGUN
13.02.15
✎
12:53
|
+(42) Хотя в T-SQL можно, там циклы есть :)
|
|||
44
Powerfool
13.02.15
✎
12:55
|
(43) Это язык запросов такой язык запросов
|
|||
45
ShoGUN
13.02.15
✎
12:57
|
(44) Нет, это T-SQL - язык программирования, а не язык запросов.
|
|||
46
Garykom
гуру
13.02.15
✎
13:01
|
(0) нифига не понял но уточни
Как сравнивать то объекты нужно попарно? Т.е. цель сравнения какая? Узнать равны ли между собой, или больше меньше или еще что? |
|||
47
Garykom
гуру
13.02.15
✎
13:02
|
(46)+ просто если на равенство то есть такая чтука как хеширование... а если на больше-меньше то в массиву их линенейну и отпузырить )) в смысле сортировка
|
|||
48
Jaap Vduul
13.02.15
✎
13:04
|
Если я правильно понял ТС, то нужен такой запрос:
ВЫБРАТЬ Справочник1.Ссылка Ссылка1, Справочник2.Ссылка Ссылка2 ИЗ Справочник.Какойто КАК Справочник1, Справочник.Какойто КАК Справочник2 ГДЕ Справочник1.Ссылка <> Справочник2.Ссылка И Справочник1.Ссылка < Справочник2.Ссылка |
|||
49
ShoGUN
13.02.15
✎
13:09
|
(48) А сравнение на >/< на ссылках нормально будет работать? Ну и условие Справочник1.Ссылка <> Справочник2.Ссылка - лишнее, > - уже "не равно".
|
|||
50
Powerfool
13.02.15
✎
13:10
|
(48) Не сталкивался с таким сравнением что значит
И Справочник1.Ссылка < Справочник2.Ссылка ? |
|||
51
Powerfool
13.02.15
✎
13:12
|
(46) (47) см (30)
|
|||
52
Garykom
гуру
13.02.15
✎
13:16
|
(51) так бы и сказал что сочетания нужны из комбинаторики...
|
|||
53
Powerfool
13.02.15
✎
13:24
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | Таблица.Объект, | 0 КАК НомерСтроки |ИЗ | Таблица КАК Таблица"; ТЗ = Запрос.Выполнить().Выгрузить(); ъ = 1; Для Каждого Строка Из ТЗ Цикл Строка.НомерСтроки = ъ; ъ = ъ + 1; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.НомерСтроки, | ТЗ.Объект |ПОМЕСТИТЬ ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.Объект КАК От, | ТЗ1.Объект КАК До |ИЗ | ТЗ КАК ТЗ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ1 | ПО ТЗ.НомерСтроки > ТЗ1.НомерСтроки"; Запрос.УстановитьПараметр("ТЗ", ТЗ); |
|||
54
Powerfool
13.02.15
✎
13:24
|
Всем спасибо. Один бы я хрен допер
|
|||
55
ShoGUN
13.02.15
✎
13:30
|
(53) Ссылки точно все разные? :))) А то в первом запросе группировка бы не помешала.
|
|||
56
Powerfool
13.02.15
✎
13:38
|
(55) Да точно - это измерение (единственное) РС
|
|||
57
Powerfool
13.02.15
✎
13:53
|
Вот всем небольшой подарок за помощь, Особенное спасибо ShoGUN (кстати откуда название? Это связано с софтом по статистике?)
Алгоритм для расчета расстояний между объектами зная их координаты и по запихиванию их в БД Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДК_КоординатыОбъектов.Объект, | 0 КАК НомерСтроки |ИЗ | РегистрСведений.КоординатыОбъектов КАК КоординатыОбъектов"; ТЗ = Запрос.Выполнить().Выгрузить(); Кол = ТЗ.Количество(); Строчка = "Найдено объектов с координатами " + Строка(Кол) + ", итераций при расчете расстояний " + Формат((Кол*Кол-Кол)/2, "ЧДЦ="); ъ = 1; Для Каждого Строка Из ТЗ Цикл Строка.НомерСтроки = ъ; ъ = ъ + 1; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.НомерСтроки, | ТЗ.Объект |ПОМЕСТИТЬ ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.Объект КАК От, | ТЗ1.Объект КАК До |ПОМЕСТИТЬ Комбинации |ИЗ | ТЗ КАК ТЗ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ1 | ПО ТЗ.НомерСтроки > ТЗ1.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Комбинации.От, | Комбинации.До, | (КОТ.Широта * &пи / 180 - КДО.Широта * &пи / 180) / 2 КАК РазницаКоординатПоШироте, | (КОТ.Долгота * &пи / 180 - КДО.Долгота * &пи / 180) / 2 КАК РазницаКоординатПоДолготе, | КОТ.Широта * &пи / 180 КАК ШиротаОт, | КДО.Широта * &пи / 180 КАК ШиротаДо, | КОТ.Долгота * &пи / 180 КАК ДолготаОт, | КДО.Долгота * &пи / 180 КАК ДолготаДо |ИЗ | Комбинации КАК Комбинации | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КоординатыОбъектов КАК КОТ | ПО Комбинации.От = КОТ.Объект | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КоординатыОбъектов КАК КДО | ПО Комбинации.До = КДО.Объект"; Запрос.УстановитьПараметр("ТЗ", ТЗ); Запрос.УстановитьПараметр("пи", 3.1415926535897932); Выборка = Запрос.Выполнить().Выбрать(); Набор = РегистрыСведений.РасстоянияМеждуОбъектами.СоздатьНаборЗаписей(); ъ = 1; Пока Выборка.Следующий() Цикл Запись = Набор.Добавить(); Запись.От = Выборка.От; Запись.До = Выборка.До; //Формула гаверсинусов http://gis-lab.info/qa/great-circles.html Запись.Расстояние = 2*Asin(sqrt(pow(sin(Выборка.РазницаКоординатПоШироте),2) + cos(Выборка.ШиротаОт)*cos(Выборка.ШиротаДо)*pow(sin(Выборка.РазницаКоординатПоДолготе),2)))*6372.795; //Запись.Расстояние = Sqrt(pow(ВыборкаОт.Широта - ВыборкаДо.Широта, 2) + pow(ВыборкаОт.Долгота - ВыборкаДо.Долгота, 2)); Состояние(Строчка + ", итерация " + Строка(ъ)); ъ = ъ + 1; ОбработкаПрерыванияПользователя(); КонецЦикла; Набор.Записать(); |
|||
58
Powerfool
13.02.15
✎
13:54
|
(57) Эта прога даже без скд шуршит раз в 10 быстрее чем моя предыдущая версия с программным перебором
|
|||
59
Powerfool
13.02.15
✎
14:00
|
Объектов `1500, сочетаний `1 000 000, время работы снизили с `4 часов до `10 минут
|
|||
60
Garykom
гуру
13.02.15
✎
14:04
|
(57)(59) в смысле маршрут объезда точек? кратчайший?
|
|||
61
Powerfool
13.02.15
✎
14:12
|
(60) Если захочется
|
|||
62
Garykom
гуру
13.02.15
✎
14:14
|
(61) а оно дороги учитывает? в смысле реальные расстояния по дорогам (кривым и с учетом скорости движения а не просто длины) между точками?
|
|||
63
ShoGUN
13.02.15
✎
14:34
|
(57) История моего ника уходит корнями в глубь веков :)
За прогу спасибо, схоронил. |
|||
64
Crush
13.02.15
✎
19:09
|
(50) Осилил дочитать до 50 поста. Когда то сталкивался с необходимостью выбрать уникальные пары в запросе. Для этого добавлял условие Знач1<Знач2.
|
|||
65
Powerfool
16.02.15
✎
05:28
|
(62) Нет, это расстояние без дорог. С дорогами бери из гугла или яндекса
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |