|
Получить длину объединения | ☑ | ||
---|---|---|---|---|
0
Ненавижу 1С
гуру
28.06.12
✎
11:57
|
В рамках 1С 8 тренировочная задачка на запросы
Есть таблица Т с двумя числовыми полями А и Б, А<Б всегда Каждая запись таблицы интерпретируется как отрезок с координами концов А и Б на координатной прямой Берется объединение всех отрезков таблицы Требуется найти длину полученного объединения |
|||
1
mikecool
28.06.12
✎
11:58
|
мин(А) - макс(Б) не?
|
|||
2
mikecool
28.06.12
✎
11:58
|
или пропуски тоже учитывать?
|
|||
3
mikecool
28.06.12
✎
11:58
|
и решабельно ли это запросом?
|
|||
4
eromanov
28.06.12
✎
12:00
|
(1)
1-4 2-6 итог 5 не равно 8 |
|||
5
Ненавижу 1С
гуру
28.06.12
✎
12:01
|
(2) конечно, иначе смысла нет
(3) запросом только (4) правильный ответ в твоем примере 5 |
|||
6
mikecool
28.06.12
✎
12:02
|
(5) ну дык, без учета пропусков max(Б) - min(А) )))
|
|||
7
ssh2012
28.06.12
✎
12:02
|
хм, щас посмотрим
|
|||
8
mikecool
28.06.12
✎
12:04
|
(5) сам то написал запрос?
|
|||
9
Alex S D
28.06.12
✎
12:05
|
(6) 1 - 5, 10 - 20, длина = 5 + 10. не прет твоя формула)
|
|||
10
DrShad
28.06.12
✎
12:05
|
а тупо посчитать длину отрезка в каждой строке и итог, не?
|
|||
11
mikecool
28.06.12
✎
12:06
|
(9) у меня частное решение, что ты не заметил
|
|||
12
Alex S D
28.06.12
✎
12:06
|
(10) а если они пересекаются?
|
|||
13
DrShad
28.06.12
✎
12:06
|
(12) да вот уже дошел до такого условия :)
|
|||
14
mikecool
28.06.12
✎
12:07
|
ненавижу Ненавижу 1С
|
|||
15
acsent
28.06.12
✎
12:07
|
сумма всех длин - попарное пересечение всех отрезков
|
|||
16
eromanov
28.06.12
✎
12:08
|
(0) Тест при приеме на работу?)
|
|||
17
Ненавижу 1С
гуру
28.06.12
✎
12:22
|
(8) да
(16) кстати, вполне может быть |
|||
18
Ненавижу 1С
гуру
28.06.12
✎
12:22
|
(14) почему?
|
|||
19
Alex S D
28.06.12
✎
12:25
|
я б сделал, но работать надо
|
|||
20
eromanov
28.06.12
✎
12:32
|
(19) Красиво отмазался)
|
|||
21
ssh2012
28.06.12
✎
12:43
|
(18) Вот, например для проверки резудьтата исходная таблица, должно 6 получится?
ВЫБРАТЬ 1 КАК А, 2 КАК Б ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 10 |
|||
22
Ненавижу 1С
гуру
28.06.12
✎
12:45
|
(21) должно 5 получиться
|
|||
23
ssh2012
28.06.12
✎
12:46
|
(22) тогда я не понял условие, почему 5?
|
|||
24
Ненавижу 1С
гуру
28.06.12
✎
12:47
|
(23) ну у тебя после объединения фактически два отрезка получатся 1-5 и 9-10, длина первого 4, второго 1
|
|||
25
ssh2012
28.06.12
✎
12:48
|
(24) ну да, 5 конечно, а не 6
|
|||
26
МихаилМ
28.06.12
✎
12:50
|
(0)
если исходная выборка 1-4 2-6 9-12 10-20 45-46 как должна выглядеть результирующая выборка ? |
|||
27
Ненавижу 1С
гуру
28.06.12
✎
12:51
|
(26) я вам что, калькулятор?
объединяем, получаем 1-6 9-20 45-46 5+11+1=17 |
|||
28
ssh2012
28.06.12
✎
12:53
|
(27) зачем калькулятор, у тебя же готовый запрос есть, подставляй))
|
|||
29
Cyberhawk
28.06.12
✎
12:54
|
Мне думается, что существует готовач формула для такой задачи и в запросе надо не изобретать велосипед, а воспользоваться ею :)
|
|||
30
Ненавижу 1С
гуру
28.06.12
✎
12:55
|
(28) дык в неудобном виде он данные дал ))
(29) выдай нам ее |
|||
31
Cyberhawk
28.06.12
✎
12:56
|
(30) а последовательность отрезков в исходной таблице произвольная?
|
|||
32
Ненавижу 1С
гуру
28.06.12
✎
12:57
|
(31) а это на что может повлиять?
работая с таблицами БД надо абстрагироваться от понятия порядок |
|||
33
y88
28.06.12
✎
13:00
|
внутреннее соединение, не?
|
|||
34
Homer
28.06.12
✎
13:04
|
//
ВЫБРАТЬ 1 КАК Поле1, 5 КАК Поле2 ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, 10 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мТаб.Поле1, мТаб.Поле2 - мТаб.Поле1 КАК Раз, мТаб.Поле2 ПОМЕСТИТЬ мТаб2 ИЗ мТаб КАК мТаб ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мТаб2.Поле1 КАК Поле1, мТаб2.Раз КАК Раз, мТаб2.Поле2 КАК Поле2 ПОМЕСТИТЬ мДва ИЗ мТаб2 КАК мТаб2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб2 КАК мТаб21 ПО мТаб2.Поле1 >= мТаб21.Поле1 И мТаб2.Поле2 > мТаб21.Поле2 СГРУППИРОВАТЬ ПО мТаб2.Поле1, мТаб2.Раз, мТаб2.Поле2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(мТаб2.Поле1) КАК Поле1, ВложенныйЗапрос.Поле1 КАК Поле11 ПОМЕСТИТЬ мОдин ИЗ мТаб2 КАК мТаб2, (ВЫБРАТЬ ПЕРВЫЕ 1 мДва.Поле1 КАК Поле1 ИЗ мДва КАК мДва) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мрез2.Поле1, мрез2.Раз КАК Раз, мрез2.Поле2 ИЗ (ВЫБРАТЬ мОдин.Поле1 КАК Поле1, мОдин.Поле11 - мОдин.Поле1 КАК Раз, мОдин.Поле11 КАК Поле2 ИЗ мОдин КАК мОдин ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ мДва.Поле1, мДва.Раз, мДва.Поле2 ИЗ мДва КАК мДва) КАК мрез2 ИТОГИ СУММА(Раз) ПО ОБЩИЕ |
|||
35
Homer
28.06.12
✎
13:09
|
(34)пример не удачный, не работает
|
|||
36
PuhUfa
28.06.12
✎
13:11
|
Создаем Таблицу (ТаблицаКоординат) количеством столбцов макс(Б)
Заполняем ее данными из исходной таблицы по принципу: 1 строка исходной Т -> 1 строка ТаблицыКоординат в столбцы ТаблицыКоординат пишем 0 или 1 в зависимости от того попадает номер этого столбца в отрезок А-Б Пример: Исходня Т А = 2 Б = 5 А = 3 Б = 4 ТаблицаКоординат: 0|1|1|1|1 0|0|1|1|0 ТаблицаКоординат сворачиваем, считаем количество столбцов где значение не равно 0. ps во блин загнул -) |
|||
37
Homer
28.06.12
✎
13:12
|
ВЫБРАТЬ
1 КАК Поле1, 5 КАК Поле2 ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, 10 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, 14 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мТаб.Поле1, мТаб.Поле2 - мТаб.Поле1 КАК Раз, мТаб.Поле2 ПОМЕСТИТЬ мТаб2 ИЗ мТаб КАК мТаб ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мТаб2.Поле1 КАК Поле1, мТаб2.Раз КАК Раз, мТаб2.Поле2 КАК Поле2 ПОМЕСТИТЬ мДва ИЗ мТаб2 КАК мТаб2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб2 КАК мТаб21 ПО мТаб2.Поле1 >= мТаб21.Поле1 И мТаб2.Поле2 > мТаб21.Поле2 И мТаб2.Поле1 < мТаб21.Поле2 СГРУППИРОВАТЬ ПО мТаб2.Поле1, мТаб2.Раз, мТаб2.Поле2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(мТаб2.Поле1) КАК Поле1, ВложенныйЗапрос.Поле1 КАК Поле11 ПОМЕСТИТЬ мОдин ИЗ мТаб2 КАК мТаб2, (ВЫБРАТЬ ПЕРВЫЕ 1 мДва.Поле1 КАК Поле1 ИЗ мДва КАК мДва) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ мрез2.Поле1, мрез2.Раз КАК Раз, мрез2.Поле2 ИЗ (ВЫБРАТЬ мОдин.Поле1 КАК Поле1, мОдин.Поле11 - мОдин.Поле1 КАК Раз, мОдин.Поле11 КАК Поле2 ИЗ мОдин КАК мОдин ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ мДва.Поле1, мДва.Раз, мДва.Поле2 ИЗ мДва КАК мДва) КАК мрез2 ИТОГИ СУММА(Раз) ПО ОБЩИЕ |
|||
38
Homer
28.06.12
✎
13:12
|
(37) а так работает
|
|||
39
Ненавижу 1С
гуру
28.06.12
✎
13:13
|
(38) да вроде и (34) работало
|
|||
40
Homer
28.06.12
✎
13:14
|
(39) пример не удачный, (37) тоже не работает, опять же пример не удачный
|
|||
41
Ненавижу 1С
гуру
28.06.12
✎
13:15
|
(40) что значит "пример неудачный"? запрос должен работать на любых данных
|
|||
42
Homer
28.06.12
✎
13:16
|
вот в том то и дела беру другие данные и уже не работает
|
|||
43
Cyberhawk
28.06.12
✎
13:17
|
(41) сколько у тебя строк в запросе?
|
|||
44
Cyberhawk
28.06.12
✎
13:17
|
(42) + не считая формирования входных данных
|
|||
45
Buster007
28.06.12
✎
13:18
|
боюсь, что если такое задание использовать в качестве теста при приеме на работу, то это сразу от 130 ))
|
|||
46
Ненавижу 1С
гуру
28.06.12
✎
13:18
|
(44) 52 вроде, с форматированием конструктором
|
|||
47
Ненавижу 1С
гуру
28.06.12
✎
13:19
|
(45) это же хорошо
|
|||
48
Alex S D
28.06.12
✎
13:20
|
у ненавижу работы нету, сам ставит себе задачи, решает их , а потом не дает работать остальным))
|
|||
49
Ненавижу 1С
гуру
28.06.12
✎
13:21
|
(48) завидовать не хорошо
|
|||
50
Alex S D
28.06.12
✎
13:22
|
я же белой завистью..)
|
|||
51
Cyberhawk
28.06.12
✎
13:22
|
(46) задай на вход таблицу
-5 -3 -10 -12 0 0 Работает? |
|||
52
Cyberhawk
28.06.12
✎
13:23
|
А, пардон, 0-0 убрать, не подходит по условию
|
|||
53
mikecool
28.06.12
✎
13:23
|
(18) ты мне мозг сломал )
|
|||
54
Ненавижу 1С
гуру
28.06.12
✎
13:24
|
(52) -10 -12 тоже нельзя
|
|||
55
Cyberhawk
28.06.12
✎
13:27
|
(54) хитер :)
|
|||
56
Eugene_life
28.06.12
✎
13:37
|
фактически нужно посчитать количество "разрывов"
|
|||
57
andrewks
28.06.12
✎
13:39
|
лень читать всю ветку, задача ещё актуальна?
|
|||
58
Eugene_life
28.06.12
✎
13:40
|
(57) да
|
|||
59
Ненавижу 1С
гуру
28.06.12
✎
13:41
|
(56) количество разрывов ничего не даст
(57) ждем твоего решения |
|||
60
Eugene_life
28.06.12
✎
13:42
|
(59) Количество и длина разрывов )
|
|||
61
andrewks
28.06.12
✎
13:42
|
(59) 2. гы. да я только в ветку забрёл. щас буду думать.
на всякий: отрезки на положительной "части" оси, или могут быть и в минусе? |
|||
62
mikecool
28.06.12
✎
13:44
|
плохо что в полях выборки незя использовать подзапросы (
|
|||
63
Ненавижу 1С
гуру
28.06.12
✎
13:46
|
(61) это несущественно
|
|||
64
Эмбеддер
28.06.12
✎
13:55
|
Рекурсию можно использовать?
|
|||
65
Ненавижу 1С
гуру
28.06.12
✎
13:58
|
(64) в запросе? попробуй))
+(46) нашел проще - 30 строк |
|||
66
Buster007
28.06.12
✎
14:02
|
ВЫБРАТЬ
1 КАК А, 4 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 12 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10, 20 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 45, 46 ; //////////////////////////////////////////////////////////////////////////////// Выбрать Минимум(Т1.А), Т2.Б Поместить ПредварительныеОтрезки из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А ГДЕ НЕ Т2.Б Есть NULL Сгруппировать ПО Т2.Б ; Выбрать Т1.А, Т3.Б Поместить ВозможныеИзмененияМаксимальнойГраницы из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А Левое Соединение мТаб как Т3 По Т1.А = Т3.А ГДЕ Т2.Б Есть NULL ; Выбрать РАЗЛИЧНЫЕ Т1.А, ЕстьNULL(Т2.Б, Т1.Б) как Б Поместить ОтрезкиСВнутреннимиОтрезками Из ПредварительныеОтрезки как Т1 Левое соединение ВозможныеИзмененияМаксимальнойГраницы как Т2 По Т1.А < Т2.А И Т2.А < Т1.Б И Т2.Б > Т1.Б ; Выбрать Т1.А, Т1.Б Поместить ОтрезкиБезВнутреннихОтрезков Из ВозможныеИзмененияМаксимальнойГраницы как Т1 Левое соединение ОтрезкиСВнутреннимиОтрезками как Т2 ПО Т1.Б = Т2.Б ГДЕ Т2.А Есть NULL ; Выбрать Сумма(Т1.Б - Т1.А) как Итог Из (Выбрать Т1.А, Т1.Б ИЗ ОтрезкиСВнутреннимиОтрезками как Т1 Объединить все Выбрать Т1.А, Т1.Б ИЗ ОтрезкиБезВнутреннихОтрезков как Т1) как Т1 |
|||
67
Buster007
28.06.12
✎
14:03
|
(66) вроде без промашек работает )
|
|||
68
mikecool
28.06.12
✎
14:08
|
вначале тестовые данные |
|||
69
vicof
28.06.12
✎
14:09
|
(67) нифига
ВЫБРАТЬ 1 КАК А, 18 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5, 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7, 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 12, 15 ; |
|||
70
mikecool
28.06.12
✎
14:09
|
+68 наверное не все учел, а то строк мало получается + мой запрос еще можно укоротить ))
|
|||
71
mikecool
28.06.12
✎
14:10
|
+70 а, блин, мой только с одним пересечением работает, кажись (((
|
|||
72
mikecool
28.06.12
✎
14:11
|
+71 на данных из (69) выдает 21 ((
|
|||
73
Buster007
28.06.12
✎
14:12
|
(69) согласен)
|
|||
74
mikecool
28.06.12
✎
14:15
|
+72 диапазон 5-9 левый цепляется ((
|
|||
75
mikecool
28.06.12
✎
14:16
|
+74 надо отслеживать многократное пересечение
вот тут голова опухает - типа сколько же соединений надо |
|||
76
rs_trade
28.06.12
✎
14:20
|
хорошо бы в таких веточках писать сразу код для mssms, готовящий таблицы с исходными данными. как принято на sql.ru например.
|
|||
77
Buster007
28.06.12
✎
14:28
|
ВЫБРАТЬ
1 КАК А, 4 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 12 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10, 20 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 45, 46 ; //////////////////////////////////////////////////////////////////////////////// Выбрать Минимум(Т1.А), Т2.Б Поместить ПредварительныеОтрезки из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А ГДЕ НЕ Т2.Б Есть NULL Сгруппировать ПО Т2.Б ; Выбрать Т1.А, Т3.Б Поместить ВозможныеИзмененияМаксимальнойГраницы из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А Левое Соединение мТаб как Т3 По Т1.А = Т3.А ГДЕ Т2.Б Есть NULL Объединить все Выбрать Различные Т1.А, Т2.Б ИЗ ПредварительныеОтрезки как Т1 Внутреннее соединение мТаб как Т2 ПО т1.А = т2.А и Т1.Б < Т2.Б ; Выбрать РАЗЛИЧНЫЕ Т1.А, Максимум(ЕстьNULL(Т2.Б, Т1.Б)) как Б Поместить ОтрезкиСВнутреннимиОтрезками Из ПредварительныеОтрезки как Т1 Левое соединение ВозможныеИзмененияМаксимальнойГраницы как Т2 По Т1.А <= Т2.А И Т2.А < Т1.Б И Т2.Б > Т1.Б Сгруппировать ПО т1.А ; Выбрать Т1.А, Т1.Б Поместить ОтрезкиБезВнутреннихОтрезков Из ВозможныеИзмененияМаксимальнойГраницы как Т1 Левое соединение ОтрезкиСВнутреннимиОтрезками как Т2 ПО Т1.Б = Т2.Б ГДЕ Т2.А Есть NULL ; Выбрать Сумма(Т1.Б - Т1.А) как Итог Из (Выбрать Т1.А, Т1.Б ИЗ ОтрезкиСВнутреннимиОтрезками как Т1 Объединить все Выбрать Т1.А, Т1.Б ИЗ ОтрезкиБезВнутреннихОтрезков как Т1 Левое Соединение ОтрезкиСВнутреннимиОтрезками как Т2 По Т1.А> Т2.А И Т1.А < Т2.Б ГДЕ Т2.А Есть NULL) как Т1 |
|||
78
Buster007
28.06.12
✎
14:28
|
(77) теперь должно работать ))
|
|||
79
Buster007
28.06.12
✎
14:30
|
+(78) не, не работает ) ща )
|
|||
80
GomerSimpson
28.06.12
✎
14:30
|
ВЫБРАТЬ
СУММА(ВТ.Б - ВТ.А) КАК ДлинаНепересекающихся ПОМЕСТИТЬ НеПересекающиеся ИЗ ВТ КАК ВТ ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1 ПО (ВТ.А < ВТ1.Б И ВТ.А > ВТ1.А ИЛИ ВТ.Б < ВТ1.Б И ВТ.Б > ВТ1.А) ГДЕ ВТ1.Ссылка ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(ВТ.А) КАК А, МАКСИМУМ(ВТ.Б) КАК Б ПОМЕСТИТЬ Пересекающиеся ИЗ ВТ КАК ВТ ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1 ПО (ВТ.А < ВТ1.Б И ВТ.А > ВТ1.А ИЛИ ВТ.Б < ВТ1.Б И ВТ.Б > ВТ1.А) ГДЕ НЕ ВТ1.Ссылка ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НеПересекающиеся.ДлинаНепересекающихся + Пересекающиеся.Б - Пересекающиеся.А ИЗ НеПересекающиеся КАК НеПересекающиеся, Пересекающиеся КАК Пересекающиеся |
|||
81
Buster007
28.06.12
✎
14:32
|
вот
ВЫБРАТЬ 1 КАК А, 20 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 12 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10, 19 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 18, 46 ; //////////////////////////////////////////////////////////////////////////////// Выбрать Минимум(Т1.А), Т2.Б Поместить ПредварительныеОтрезки из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А ГДЕ НЕ Т2.Б Есть NULL Сгруппировать ПО Т2.Б ; Выбрать Т1.А, Т3.Б Поместить ВозможныеИзмененияМаксимальнойГраницы из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А Левое Соединение мТаб как Т3 По Т1.А = Т3.А ГДЕ Т2.Б Есть NULL Объединить все Выбрать Различные Т1.А, Т2.Б ИЗ ПредварительныеОтрезки как Т1 Внутреннее соединение мТаб как Т2 ПО т1.А = т2.А и Т1.Б < Т2.Б ; Выбрать РАЗЛИЧНЫЕ Т1.А, Максимум(ЕстьNULL(Т2.Б, Т1.Б)) как Б Поместить ОтрезкиСВнутреннимиОтрезками Из ПредварительныеОтрезки как Т1 Левое соединение ВозможныеИзмененияМаксимальнойГраницы как Т2 По Т1.А <= Т2.А И Т2.А < Т1.Б И Т2.Б > Т1.Б Сгруппировать ПО т1.А ; Выбрать Т1.А, Т1.Б Поместить ОтрезкиБезВнутреннихОтрезков Из ВозможныеИзмененияМаксимальнойГраницы как Т1 Левое соединение ОтрезкиСВнутреннимиОтрезками как Т2 ПО Т1.Б = Т2.Б ГДЕ Т2.А Есть NULL ; Выбрать Сумма(Т1.Б - Т1.А) как Итог Из (Выбрать Т1.А, Т1.Б ИЗ ОтрезкиСВнутреннимиОтрезками как Т1 Объединить все Выбрать Т1.А, Т1.Б ИЗ ОтрезкиБезВнутреннихОтрезков как Т1 Левое Соединение ОтрезкиСВнутреннимиОтрезками как Т2 По Т1.А>= Т2.А И Т1.А <= Т2.Б ГДЕ Т2.А Есть NULL) как Т1 |
|||
82
ssh2012
28.06.12
✎
14:33
|
(80) > ВТ1.Ссылка o_O
|
|||
83
mikecool
28.06.12
✎
14:34
|
все, надоело думать )))
|
|||
84
Buster007
28.06.12
✎
14:34
|
(80) а откуда ссылка взялась?)
|
|||
85
mikecool
28.06.12
✎
14:34
|
в моем алгоритме где то небольшой косяк )))
|
|||
86
ssh2012
28.06.12
✎
14:35
|
(84) не работает
ВЫБРАТЬ 1 КАК А, 2 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, 10 ; |
|||
87
Eugene_life
28.06.12
✎
14:36
|
(81) Если подставить в конце
ВЫБРАТЬ 20, 46 то выдает 19 :)))) |
|||
88
Ненавижу 1С
гуру
28.06.12
✎
14:36
|
(76) ок, вот заготовочка
ВЫБРАТЬ 1 КАК А, 4 КАК Б ПОМЕСТИТЬ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7, 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 10 ; |
|||
89
Buster007
28.06.12
✎
14:38
|
(87) гм, не предусмотрел, что в А и Б в разных отрезках будет одинаковое число )
ну эт фигня ) |
|||
90
ssh2012
28.06.12
✎
14:39
|
(88) проверь свой данными (86). работает?
|
|||
91
Ненавижу 1С
гуру
28.06.12
✎
14:40
|
(90) выдает 9
|
|||
92
ssh2012
28.06.12
✎
14:40
|
(91) ок
|
|||
93
mikecool
28.06.12
✎
14:42
|
а у меня - 7 (
|
|||
94
GomerSimpson
28.06.12
✎
14:43
|
ВЫБРАТЬ
СУММА(ВТ.Б - ВТ.А) КАК ДлинаНепересекающихся ПОМЕСТИТЬ НеПересекающиеся ИЗ ВТ КАК ВТ ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1 ПО (ВТ.А < ВТ1.Б И ВТ.А > ВТ1.А ИЛИ ВТ.Б < ВТ1.Б И ВТ.Б > ВТ1.А) ГДЕ ВТ1.А ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(ВТ.А) КАК А, МАКСИМУМ(ВТ.Б) КАК Б ПОМЕСТИТЬ Пересекающиеся ИЗ ВТ КАК ВТ ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1 ПО (ВТ.А < ВТ1.Б И ВТ.А > ВТ1.А ИЛИ ВТ.Б < ВТ1.Б И ВТ.Б > ВТ1.А) ГДЕ НЕ ВТ1.А ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НеПересекающиеся.ДлинаНепересекающихся + Пересекающиеся.Б - Пересекающиеся.А ИЗ НеПересекающиеся КАК НеПересекающиеся, Пересекающиеся КАК Пересекающиеся |
|||
95
Buster007
28.06.12
✎
14:44
|
(91)
ВЫБРАТЬ 1 КАК А, 4 КАК Б ПОМЕСТИТЬ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 10 с такими данными что выдает? |
|||
96
Buster007
28.06.12
✎
14:45
|
+(95) у меня херню ))
|
|||
97
Эмбеддер
28.06.12
✎
14:45
|
(94) да, решение должно быть таким. красивым
|
|||
98
ssh2012
28.06.12
✎
14:45
|
(94) на (86) длига null :))
|
|||
99
Ненавижу 1С
гуру
28.06.12
✎
14:45
|
(95) 9
|
|||
100
ssh2012
28.06.12
✎
14:45
|
*длина
|
|||
101
Buster007
28.06.12
✎
15:01
|
ну всё ) по последним данным всё работает прекрасно )
ВЫБРАТЬ 1 КАК А, 4 КАК Б ПОМЕСТИТЬ мТаб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6, 13 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10, 11 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, 10 ; //////////////////////////////////////////////////////////////////////////////// Выбрать Минимум(Т1.А), Т2.Б Поместить ПредварительныеОтрезки из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А ГДЕ НЕ Т2.Б Есть NULL Сгруппировать ПО Т2.Б ; Выбрать Т1.А, Т3.Б Поместить ВозможныеИзмененияМаксимальнойГраницы из мТаб как т1 Левое соединение мТаб как Т2 по т1.А < т2.А И т1.Б > т2.А Левое Соединение мТаб как Т3 По Т1.А = Т3.А ГДЕ Т2.Б Есть NULL Объединить все Выбрать Различные Т1.А, Т2.Б ИЗ ПредварительныеОтрезки как Т1 Внутреннее соединение мТаб как Т2 ПО т1.А = т2.А и Т1.Б < Т2.Б ; Выбрать РАЗЛИЧНЫЕ Т1.А, Максимум(ЕстьNULL(Т2.Б, Т1.Б)) как Б Поместить ОтрезкиСВнутреннимиОтрезками Из ПредварительныеОтрезки как Т1 Левое соединение ВозможныеИзмененияМаксимальнойГраницы как Т2 По Т1.А <= Т2.А И Т2.А <= Т1.Б И Т2.Б > Т1.Б Сгруппировать ПО т1.А ; Выбрать Различные Т1.А, Т1.Б Поместить ОтрезкиБезВнутреннихОтрезков Из ВозможныеИзмененияМаксимальнойГраницы как Т1 Левое соединение ОтрезкиСВнутреннимиОтрезками как Т2 ПО Т1.Б = Т2.Б ГДЕ Т2.А Есть NULL ; Выбрать Сумма(Т1.Б - Т1.А) как Итог Из (Выбрать Т1.А, Т1.Б ИЗ ОтрезкиСВнутреннимиОтрезками как Т1 Объединить все Выбрать Т1.А, Т1.Б ИЗ ОтрезкиБезВнутреннихОтрезков как Т1 Левое Соединение ОтрезкиСВнутреннимиОтрезками как Т2 По Т1.А>= Т2.А И Т1.А <= Т2.Б ГДЕ Т2.А Есть NULL) как Т1 |
|||
102
ssh2012
28.06.12
✎
15:03
|
(101) на (86) ошибка
|
|||
103
Buster007
28.06.12
✎
15:10
|
(102) я конечно исправил )
но стоит ли уже захламлять форум?)) |
|||
104
Ненавижу 1С
гуру
28.06.12
✎
15:12
|
(103) давать свое решение?
|
|||
105
Buster007
28.06.12
✎
15:13
|
(104) ога ) тем более, что оно как-то не смотрится ))
|
|||
106
alexhtn
28.06.12
✎
15:17
|
Сначала суммирую все отрезки, а потом отнимаю пересекающиеся интервалы
ВЫБРАТЬ Данные.ПолеБ - Данные.ПолеА + 1 КАК Сумма ПОМЕСТИТЬ Итоговая ИЗ Данные КАК Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ -(Данные1.ПолеБ - Данные2.ПолеА + 1) ИЗ Данные КАК Данные1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Данные КАК Данные2 ПО Данные1.ПолеБ > Данные2.ПолеА И Данные1.ПолеБ < Данные2.ПолеБ И Данные1.ПолеА < Данные2.ПолеА И Данные1.ПолеБ > Данные2.ПолеА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(Итоговая.Сумма) КАК Сумма ИЗ Итоговая КАК Итоговая |
|||
107
Ненавижу 1С
гуру
28.06.12
✎
15:18
|
ВЫБРАТЬ
1 КАК А, 2 КАК Б ПОМЕСТИТЬ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, 10 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Т1.А ПОМЕСТИТЬ Левые ИЗ Т КАК Т1 ЛЕВОЕ СОЕДИНЕНИЕ Т КАК Т2 ПО Т1.А > Т2.А И Т1.А <= Т2.Б СГРУППИРОВАТЬ ПО Т1.А ИМЕЮЩИЕ КОЛИЧЕСТВО(Т2.А) = 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Т1.Б ПОМЕСТИТЬ Правые ИЗ Т КАК Т1 ЛЕВОЕ СОЕДИНЕНИЕ Т КАК Т2 ПО Т1.Б < Т2.Б И Т1.Б >= Т2.А СГРУППИРОВАТЬ ПО Т1.Б ИМЕЮЩИЕ КОЛИЧЕСТВО(Т2.Б) = 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Левые.А, МИНИМУМ(Правые.Б) КАК Б ПОМЕСТИТЬ Объединение ИЗ Левые КАК Левые ВНУТРЕННЕЕ СОЕДИНЕНИЕ Правые КАК Правые ПО Левые.А < Правые.Б СГРУППИРОВАТЬ ПО Левые.А ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(Объединение.Б) - СУММА(Объединение.А) КАК Поле1 ИЗ Объединение КАК Объединение |
|||
108
Ненавижу 1С
гуру
28.06.12
✎
15:19
|
(106) неправильно он работает
|
|||
109
sergeante
28.06.12
✎
15:23
|
да ну вас нафиг, загрузили ужс
|
|||
110
andrewks
28.06.12
✎
15:27
|
(107) примерно в эту сторону и думал, но сформулировать не успел :(
решения для таких задачек нужно как минимум до след.дня придерживать, а то на работе не сели так, что аж некогда задачки с мисты решать :) |
|||
111
Ненавижу 1С
гуру
28.06.12
✎
15:30
|
(110) а у меня назрело обобщение ))
Есть таблица Т с числовыми полями А1, Б1, А2, Б2 и А1<А2, Б1<Б2 всегда Каждая запись таблицы интерпретируется как прямоугольник с координатами противоположных вершин (А1,Б1) и (А2,Б2) на координатной плоскости и сторонами параллельными осям координат Берется объединение всех прямоугольников Найти площадь объединения |
|||
112
Эмбеддер
28.06.12
✎
15:33
|
(106) что он выдаст, если взять 3 одинаковых отрезка?
|
|||
113
andrewks
28.06.12
✎
16:05
|
(111) э-э-э... я, может, чё-то недопонял, но, мне кажется. не взлетит.
объединение прямоугольников не есть множество прямоугольников, в отличие от отрезков |
|||
114
rs_trade
28.06.12
✎
16:12
|
||||
115
rs_trade
28.06.12
✎
16:14
|
(114) круть какая получилась. оказывается есть юзер t
|
|||
116
andrewks
28.06.12
✎
16:14
|
select from registered-user порадовало :)))
|
|||
117
rs_trade
28.06.12
✎
16:16
|
может так прокатит
declare @tbl table (id int, a int, b int) insert @tbl values (1, 1, 5), (2, 2, 11), (3, 18,21), (4, 20,30) select sum(case when isnull(t2.b-t2.a, 0) > t1.a then t1.b - isnull(t2.b-t2.a, t1.a) else t1.b - t1.a end) from @tbl t1 left join @tbl t2 on t2.id = t1.id-1 |
|||
118
andrewks
28.06.12
✎
16:19
|
(117) попробуй с такими входными данными:
insert @tbl values (1, 1, 5), (2, 2, 11), (3, 2, 11), (4, 2, 11) что выдаст? |
|||
119
Ненавижу 1С
гуру
28.06.12
✎
16:28
|
(113) да, не является, в том и соль
|
|||
120
rs_trade
28.06.12
✎
16:32
|
(118) угу. у меня еще и отрезки по возрастающей идут. не годится.
|
|||
121
rs_trade
28.06.12
✎
18:43
|
а если вот таким макаром еще забацать ))
declare @tbl table (id int, a int, b int) insert @tbl values (1, 1, 5) ,(2, 2, 11) ,(3, 18, 21) ,(4, 20, 30) ,(5, 2, 11) ; with cte1 as ( select v1.number from @tbl as t1 left join master..spt_values v1 on v1.number > t1.a and v1.number <= t1.b and v1.type ='P' group by v1.number ) select count(*) from cte1 |
|||
122
andrewks
28.06.12
✎
19:28
|
(119) да это вывих мозга. уникальность строки таблицы можно взять в условии, или ты и без этого решил?
а про прикладной смысл задачки из (0) я допетрил - это расчёт стажа в запросе, верно? |
|||
123
Ненавижу 1С
гуру
28.06.12
✎
22:29
|
(122) никаких уникальностей, а смысл?
прикладного смысла не было, но так тоже можно |
|||
124
Ненавижу 1С
гуру
29.06.12
✎
08:56
|
задача из (111) наталкивает и на еще одно решение задачи в (0)
разбиваем на элементарный прямоугольники/параллелепипеды/отрезки (всеми линиями/гранями/точками в выборке) находим для каждого входит ли он в область |
|||
125
ssh2006
29.06.12
✎
11:23
|
Интересная задачка (0)
|
|||
126
Отчегослик
03.07.12
✎
13:15
|
(111)
ВЫБРАТЬ 10 КАК А1, 10 КАК Б1, 20 КАК А2, 20 КАК Б2 ПОМЕСТИТЬ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 15, 15, 25, 25 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 15, 5, 20, 15 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10, 15, 20, 30 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ -20, 10, -10, 30 ; ВЫБРАТЬ Т.А1 КАК А ПОМЕСТИТЬ ВсеА ИЗ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Т.А2 ИЗ Т; ВЫБРАТЬ ВсеА.А ПОМЕСТИТЬ ВсеАГрупп ИЗ ВсеА СГРУППИРОВАТЬ ПО ВсеА.А; ВЫБРАТЬ ВсеАГрупп.А КАК А, КОЛИЧЕСТВО(ВсеАГрупп_1.А) КАК Порядок ПОМЕСТИТЬ ВсеАУпоряд ИЗ ВсеАГрупп ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеАГрупп КАК ВсеАГрупп_1 ПО ВсеАГрупп.А >= ВсеАГрупп_1.А СГРУППИРОВАТЬ ПО ВсеАГрупп.А; ВЫБРАТЬ Т.Б1 КАК Б ПОМЕСТИТЬ ВсеБ ИЗ Т ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Т.Б2 ИЗ Т; ВЫБРАТЬ ВсеБ.Б ПОМЕСТИТЬ ВсеБГрупп ИЗ ВсеБ СГРУППИРОВАТЬ ПО ВсеБ.Б; ВЫБРАТЬ ВсеБГрупп.Б КАК Б, КОЛИЧЕСТВО(ВсеБГрупп_1.Б) КАК Порядок ПОМЕСТИТЬ ВсеБУпоряд ИЗ ВсеБГрупп ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеБГрупп КАК ВсеБГрупп_1 ПО ВсеБГрупп.Б >= ВсеБГрупп_1.Б СГРУППИРОВАТЬ ПО ВсеБГрупп.Б; ВЫБРАТЬ ВсеАУпоряд.А, ВсеАУпоряд.Порядок КАК ПорядокА, ВсеБУпоряд.Б, ВсеБУпоряд.Порядок КАК ПорядокБ ПОМЕСТИТЬ КоординатыУпоряд ИЗ ВсеАУпоряд ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеБУпоряд ПО 1=1; ВЫБРАТЬ КУ.А КАК А1, КУ.Б КАК Б1, КУ.ПорядокА, КУ.ПорядокБ ИЗ КоординатыУпоряд КУ; ВЫБРАТЬ КоординатыУпоряд.А КАК А1, КоординатыУпоряд.Б КАК Б1, КоординатыУпоряд_1.А КАК А2, КоординатыУпоряд_1.Б КАК Б2 ПОМЕСТИТЬ МножествоПрямоугольниковЧастей ИЗ КоординатыУпоряд ВНУТРЕННЕЕ СОЕДИНЕНИЕ КоординатыУпоряд КАК КоординатыУпоряд_1 ПО КоординатыУпоряд_1.ПорядокА = КоординатыУпоряд.ПорядокА + 1 И КоординатыУпоряд_1.ПорядокБ = КоординатыУпоряд.ПорядокБ + 1; ВЫБРАТЬ МПЧ.А1, МПЧ.Б1, МПЧ.А2, МПЧ.Б2 ПОМЕСТИТЬ МножествоПрямоугольниковДляРасчета ИЗ Т ВНУТРЕННЕЕ СОЕДИНЕНИЕ МножествоПрямоугольниковЧастей КАК МПЧ ПО Т.А1 <= МПЧ.А1 И Т.Б1 <= МПЧ.Б1 И Т.А2 >= МПЧ.А2 И Т.Б2 >= МПЧ.Б2 СГРУППИРОВАТЬ ПО МПЧ.А1, МПЧ.Б1, МПЧ.А2, МПЧ.Б2; ВЫБРАТЬ СУММА( (МПР.А2 - МПР.А1) * (МПР.Б2 - МПР.Б1) ) ИЗ МножествоПрямоугольниковДляРасчета МПР ; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |