|
необычное объединение | ☑ | ||
---|---|---|---|---|
0
Ненавижу 1С
гуру
13.09.12
✎
12:54
|
Допустим есть 2 набора данных, первый:
ВАСЯ ВАСЯ ВАСЯ ПЕТЯ СЕНЯ второй: ВАСЯ ВАСЯ ПЕТЯ ПЕТЯ ДАША требуется получить из них набор, в котором каждое значение встречается максимальное число раз из этих наборов, то есть в этом примере: ВАСЯ ВАСЯ ВАСЯ ПЕТЯ ПЕТЯ СЕНЯ ДАША |
|||
1
Kashemir
13.09.12
✎
12:57
|
А что нибудь уникальное у наборов есть ?
|
|||
2
Ненавижу 1С
гуру
13.09.12
✎
12:58
|
(1) интересует случай именно неуникальных данных
|
|||
3
1C-band
13.09.12
✎
12:59
|
ВЫБРАТЬ
1 КАК Счетчик ^^^^^^^^^^ Это к основному запросу. Потом группируешь, суммируя эти единицы и сортируешь по убыванию. Эатем из этих запросов выбираешь первые 1. |
|||
4
mikecool
13.09.12
✎
12:59
|
выбрать Результат
из ( выбрать ЗначениеНабора1 Как Результат, 1 Как Счетчик1, 0 Как Счетчик2 объединить все выбрать значениеНабора2, 0, 1 ) сгруппировать По Результат имеющие Количество(Счетчик1) > Количество(Счетчик2) + наверное еще один набор с обратным условием а может гоню ) |
|||
5
МихаилМ
13.09.12
✎
13:00
|
для каждого набора
проставить признак набора объединить свернуть посчитать колво выбрать с макс кол-вом отобрать. |
|||
6
Kashemir
13.09.12
✎
13:02
|
(5) А как ты развернуть по количеству собрался ?
|
|||
7
Kashemir
13.09.12
✎
13:03
|
(2) Тут без
ВЫБРАТЬ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК ЧислоИнтервала ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa, (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb, (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc, (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd не обойтись |
|||
8
МихаилМ
13.09.12
✎
13:05
|
(7)
бред полный |
|||
9
Kashemir
13.09.12
✎
13:05
|
(8) Давай талант, покажи пример запроса - посмеемся вместе
|
|||
10
МихаилМ
13.09.12
✎
13:06
|
(9)
не припомню чтобы мы с Вами на "ты" переходили |
|||
11
Ненавижу 1С
гуру
13.09.12
✎
13:07
|
(7) если их будет больше данного интервала?
|
|||
12
Ненавижу 1С
гуру
13.09.12
✎
13:08
|
в общем требуется готовый ответ собственно, пальцем в носу ковыряться и я умею
|
|||
13
Maxus43
13.09.12
✎
13:08
|
||||
14
GLazNik
13.09.12
✎
13:09
|
Получаем две временных таблицы:
Вася 3 Петя 1 Сеня 1 Вася 2 Петя 2 Даша 1 Соединяем полным соединением по имени и получаем максимальный количество (МаксимальноеКоличество) и таблицу (Таблица) из которой это количество получилось Соединяем последню таблицу с первоначальными таблицам примерно так: ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1 ПО Таб.Таблица = 1 И Таб.Имя = Таблица1.Имя ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 ПО Таб.Таблица = 2 И Таб.Имя = Таблица2.Имя |
|||
15
Kashemir
13.09.12
✎
13:10
|
Готовое решение. Ждем решения от многоуважаемого Михаила
ВЫБРАТЬ Набор1.Имя ПОМЕСТИТЬ Набор1 ИЗ &Набор1 КАК Набор1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Набор2.Имя ПОМЕСТИТЬ Набор2 ИЗ &Набор2 КАК Набор2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Имя КАК Имя ИЗ (ВЫБРАТЬ ЕСТЬNULL(ВложенныйЗапрос.Имя, ВложенныйЗапрос1.Имя) КАК Имя, ВЫБОР КОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0) > ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0) ТОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0) ИНАЧЕ ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0) КОНЕЦ КАК МаксКоличество ИЗ (ВЫБРАТЬ Набор1.Имя КАК Имя, КОЛИЧЕСТВО(*) КАК КвоЗаписей1 ИЗ Набор1 КАК Набор1 СГРУППИРОВАТЬ ПО Набор1.Имя) КАК ВложенныйЗапрос ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Набор2.Имя КАК Имя, КОЛИЧЕСТВО(*) КАК КвоЗаписей2 ИЗ Набор2 КАК Набор2 СГРУППИРОВАТЬ ПО Набор2.Имя) КАК ВложенныйЗапрос1 ПО ВложенныйЗапрос.Имя = ВложенныйЗапрос1.Имя) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК ЧислоИнтервала ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa, (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb, (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc, (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd) КАК ВложенныйЗапрос1 ПО ВложенныйЗапрос.МаксКоличество > ВложенныйЗапрос1.ЧислоИнтервала УПОРЯДОЧИТЬ ПО Имя |
|||
16
Ненавижу 1С
гуру
13.09.12
✎
13:11
|
(14) вариант
|
|||
17
Kashemir
13.09.12
✎
13:11
|
(11) Требуется сразу определится сколько записей будет максимум - иначе не получится развернуть. Этот запрос 10000 записей тянет. Дальше надо добивать разряды
|
|||
18
Ненавижу 1С
гуру
13.09.12
✎
13:13
|
(17) тогда в топку
|
|||
19
Kashemir
13.09.12
✎
13:15
|
(18) Более универсального запроса все равно не получить.
|
|||
20
Ненавижу 1С
гуру
13.09.12
✎
13:17
|
(19) смотри (14)
|
|||
21
Kashemir
13.09.12
✎
13:19
|
(20) Не верю что взлетит. Есть готовый пример запроса ?
|
|||
22
Classic
13.09.12
✎
13:27
|
Кули тут делать. Нумеруем оба набора потом полныйджойн по значению и номеру
|
|||
23
Kashemir
13.09.12
✎
13:28
|
(21) Мда, был неправ - взлетит.
|
|||
24
GLazNik
13.09.12
✎
13:30
|
(21) Взлетит
Таблицы с подсчитанным количеством имен пусть будет Таб1 и Таб2, тогда Таб будет формироваться примерно так: ВЫБРАТЬ ЕСТЬNULL(Таб1.Имя,Таб2.Имя) КАК Имя, ВЫБОР КОГДА ЕСТЬNULL(Таб1.Количество,0)>=ЕСТЬNULL(Таб2.Количество,0) Тогда 1 ИНАЧЕ 2 КОНЕЦ Таблица ИЗ Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Таб2 ПО Таб1.Имя = Таб2.Имя Второй вариант: ВЫБРАТЬ Имя, 1 КАК Количество1 0 КАК Количество2 ИЗ Таблица1 ОБЪЕДЕНИТЬ ВСЕ ВЫБРАТЬ Имя, 0, 1 ИЗ Таблица2 группируем и соединение меняем: ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1 ПО Таб.Количество1 >= Таб.Количество2 И Таб.Имя = Таблица1.Имя ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 ПО Таб.Количество1 < Таб.Количество2 И Таб.Имя = Таблица2.Имя |
|||
25
Kashemir
13.09.12
✎
13:32
|
(24) Да, я уже понял - согласен.
ВЫБРАТЬ Набор1.Имя ПОМЕСТИТЬ Набор1 ИЗ &Набор1 КАК Набор1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Набор2.Имя ПОМЕСТИТЬ Набор2 ИЗ &Набор2 КАК Набор2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Имя КАК Имя, ВложенныйЗапрос.НомерИсходной ИЗ (ВЫБРАТЬ ЕСТЬNULL(ВложенныйЗапрос.Имя, ВложенныйЗапрос1.Имя) КАК Имя, ВЫБОР КОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0) > ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0) ТОГДА 1 ИНАЧЕ 2 КОНЕЦ КАК НомерИсходной ИЗ (ВЫБРАТЬ Набор1.Имя КАК Имя, КОЛИЧЕСТВО(*) КАК КвоЗаписей1 ИЗ Набор1 КАК Набор1 СГРУППИРОВАТЬ ПО Набор1.Имя) КАК ВложенныйЗапрос ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Набор2.Имя КАК Имя, КОЛИЧЕСТВО(*) КАК КвоЗаписей2 ИЗ Набор2 КАК Набор2 СГРУППИРОВАТЬ ПО Набор2.Имя) КАК ВложенныйЗапрос1 ПО ВложенныйЗапрос.Имя = ВложенныйЗапрос1.Имя) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ Набор1 КАК Набор1 ПО (ВложенныйЗапрос.НомерИсходной = 1 И ВложенныйЗапрос.Имя = Набор1.Имя) ЛЕВОЕ СОЕДИНЕНИЕ Набор2 КАК Набор2 ПО (ВложенныйЗапрос.НомерИсходной = 2 И ВложенныйЗапрос.Имя = Набор2.Имя) УПОРЯДОЧИТЬ ПО Имя |
|||
26
Ненавижу 1С
гуру
13.09.12
✎
13:41
|
и даже без полного соединения
ВЫБРАТЬ Т1.Поле1, КОЛИЧЕСТВО(*) КАК КоличествоСтрок, 1 КАК Флаг ПОМЕСТИТЬ Временная ИЗ Т1 КАК Т1 СГРУППИРОВАТЬ ПО Т1.Поле1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Т2.Поле1, КОЛИЧЕСТВО(*), 2 ИЗ Т2 КАК Т2 СГРУППИРОВАТЬ ПО Т2.Поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Временная.Поле1, МАКСИМУМ(Временная.КоличествоСтрок) КАК КоличествоСтрок ПОМЕСТИТЬ Свернутая ИЗ Временная КАК Временная СГРУППИРОВАТЬ ПО Временная.Поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Временная.Поле1, МИНИМУМ(Временная.Флаг) КАК Флаг ПОМЕСТИТЬ Результирующая ИЗ Свернутая КАК Свернутая ВНУТРЕННЕЕ СОЕДИНЕНИЕ Временная КАК Временная ПО Свернутая.Поле1 = Временная.Поле1 И Свернутая.КоличествоСтрок = Временная.КоличествоСтрок СГРУППИРОВАТЬ ПО Временная.Поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(Т1.Поле1, Т2.Поле1) КАК Поле1 ИЗ Результирующая КАК Результирующая ЛЕВОЕ СОЕДИНЕНИЕ Т1 КАК Т1 ПО Результирующая.Поле1 = Т1.Поле1 И (Результирующая.Флаг = 1) ЛЕВОЕ СОЕДИНЕНИЕ Т2 КАК Т2 ПО Результирующая.Поле1 = Т2.Поле1 И (Результирующая.Флаг = 2) |
|||
27
Kashemir
13.09.12
✎
13:43
|
(26) Да это понятно. Метод выбора таблицы с максимумом не вызывал затруднений.
|
|||
28
vmv
13.09.12
✎
13:51
|
ОБЪЕДИНИТЬ ВСЕ и расчить количество в результующей таблице(группирвками, итогами, агрегатами - в зависимости от степени любви к извращениям)
мдя, тупая тривиальная задача |
|||
29
МихаилМ
13.09.12
✎
14:03
|
-- обединяем таблицы с простановкой признака nf,kbws
select nomTab,name into #allTAbs from ( select 1 as nomTab,name from Table_1 union all select 2 as nomTab,name from Table_2 ) as uny -- подсчитываем количество совпадений select nomTab,name,count(name) as countname into #countsTabs from #allTAbs group by nomTab,name -- ищем наибольшие количества select name,max (countname) maxCountName into #MaxNomsCommon from #countsTabs group by name --select * from #MaxNomsCommon -- для случяя с совпадения количества -- берем количество из таблицы с наибольшим номером select max(t1.nomTab) nomTab,t1.name,t1.countname into #MaxNoms from #countsTabs as t1 INNER JOIN #MaxNomsCommon t2 on (t1.name = t2.name) and (t1.countname = t2.maxCountName) group by t1.name,t1.countname -- окончательная выборка select #allTAbs.name from #allTAbs inner join #MaxNoms on (#allTAbs.name = #MaxNoms.name) and (#allTAbs.nomTab = #MaxNoms.nomTab) drop table #MaxNoms drop table #MaxNomsCommon drop table #countsTabs drop table #allTAbs |
|||
30
Kashemir
13.09.12
✎
14:57
|
(29) Молодец. Сразу видно - старая школа - накидать запрос за полчаса в блокноте вместо 5 минут в конструкторе.
ПыСы - а временные таблицы обязательно в конце чистить ? |
|||
31
Ненавижу 1С
гуру
13.09.12
✎
15:13
|
(28) ун после готовых ответов вышли настоящие Д'Артаньяны
|
|||
32
МихаилМ
13.09.12
✎
15:19
|
(30)
для TSQL - желательно. и не чистить, а удалять. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |