|
В запросе получить уникальные одинаковые пары значений | ☑ | ||
---|---|---|---|---|
0
Собеседница
20.02.23
✎
11:09
|
привет.
нужна помощь с запросом. в результате запроса получаю несколько пар значений в двух колонках, они дублятся, нужно получить уникальные. выглядит так: https://ibb.co/mbL377y по сути 1 и 3 строки можно схлопнуть, также как и 2 и 4 в какую сторону копать? |
|||
1
rphosts
20.02.23
✎
11:12
|
(0) кури "Без повторяющихся", кури "Группировать"
|
|||
2
АгентБезопасной Нацио
20.02.23
✎
11:14
|
"аналоги" делаешь, чтоль?
выгрузи в прямом порядке, в перевернутом и выбери уникальные, например. |
|||
3
magicSan
20.02.23
✎
11:18
|
(0) запрос то покажи
|
|||
4
Собеседница
20.02.23
✎
11:22
|
да запрос сравнивает составы профилей, находит те, у которых одинаковые наборы свойств, и вот выводит соответствия, что у этих все одинаковое.
теперь нужно в этой таблице соотнести и как-то понять, что 1 и 3 строки одинаковые. и 2 и 4 тоже. и оставить или 1 и 2 строки или 3 и 4, в которых указаны пары профилей с одинаковыми свойствами и тут я поняла, что застряла |
|||
5
АгентБезопасной Нацио
20.02.23
✎
12:15
|
||||
6
magicSan
20.02.23
✎
12:19
|
(4) ну дак объедини запросы с перевертышем и отбери те у кого дубли или через левое соединение хватй тех кто не нулл
|
|||
7
Said_We
20.02.23
✎
12:45
|
(0) "в двух колонках" - а на выходе сколько колонок должно быть.
|
|||
8
АгентБезопасной Нацио
20.02.23
✎
12:53
|
(6) а все равно дубли будут, если не нулл
{"Профиль Простой", "Профиль3"} и {"Профиль 3", "Профиль Простой"} суть дубль. а он будет не нулл |
|||
9
Собеседница
20.02.23
✎
12:55
|
(5) ссылка интересная, не поняла, как ее сюда применить
(6) что есть перевертыш? я их как только не крутила, чот не получается ( (7) тоже две, но строк меньше, сотому что если поменять местами, то будут дубли |
|||
10
АгентБезопасной Нацио
20.02.23
✎
12:58
|
(9) упорядочи каждую пару в запросе, и выбери ункикальные
|
|||
11
Said_We
20.02.23
✎
13:01
|
(0) "если поменять местами" - а кто их на то или иное место ставит?
|
|||
12
АгентБезопасной Нацио
20.02.23
✎
13:02
|
(9) типа
ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫБОР КОГДА Профиль>Профиль1 ТОГДА Профиль ИНАЧЕ Профиль1 КОНЕЦ КАК Профиль, ВЫБОР КОГДА Профиль>Профиль1 ТОГДА Профиль1 ИНАЧЕ Профиль КОНЕЦ КАК Профиль1 ИЗ... |
|||
13
Собеседница
20.02.23
✎
13:03
|
(12) как раз пошла пробовать так делать
|
|||
14
Said_We
20.02.23
✎
13:03
|
(0) Другими словами откуда берется первая колонка и вторая и что такое сопоставить?
Вы задачу с конца сформулировали. Теперь сформулируйте не с того момента, на котором вы "застряли", а с самого начала. |
|||
15
Жан Пердежон
20.02.23
✎
13:06
|
ВЫБРАТЬ ТТ1.Поле1, ТТ1.Поле2
ИЗ ТТ КАК ТТ1 ЛЕВОЕ СОЕДИЕНЕНИЕ ТТ КАК ТТ2 ПО ТТ1.Поле1 = ТТ2.Поле2 И ТТ1.Поле2 = ТТ2.Поле1 ГДЕ ТТ2.Поле1 ЕСТЬ NULL через объединение тоже можно (скорее всего даже и быстрее будет) |
|||
16
lEvGl
20.02.23
✎
13:07
|
(14) ну да, похоже на то, что начальная методика не правильная выбрана, данные в этой таблице смысловой нагрузки не несут, они просто дублируют друг друга
если говорить о решении того как задан вопрос, то возможно надо получить эту таблицу через Объединить, то есть свернутую по дублирующимся строкам, потом притянуть к ним то, что нужно справа, либо различные, либо сгруппировать и т д |
|||
17
Said_We
20.02.23
✎
13:09
|
(0) "по сути 1 и 3 строки можно схлопнуть, также как и 2 и 4" - на самом деле в вашем примере нет пар которые можно "схлопнуть". У вас все пары уникальны.
Предполагаю, что в (12) догадался что вам нужно. |
|||
18
АгентБезопасной Нацио
20.02.23
✎
13:09
|
(15) не будет там нуллов
{"Профиль Простой", "Профиль3"} и {"Профиль 3", "Профиль Простой"} прекрасно соединятся "перекрестно". а в ее понятиях - это "дубли" |
|||
19
Собеседница
20.02.23
✎
13:09
|
(14)
вот например несколько профилей с их составом свойств: https://ibb.co/sPsbhm3 нужно выделить из них те, у которых полный состав свойств совпадает |
|||
20
Собеседница
20.02.23
✎
13:11
|
в итоге нужно сообщить, типа состав профиля Профиль простой совпадает с составом Наименование профиля 2
и то же самое про Профиль сложный и Наименование3 |
|||
21
Said_We
20.02.23
✎
13:13
|
(20) Может быть и три одинаковых профиля и более. Поле "Свойсто" какого типа?
|
|||
22
Жан Пердежон
20.02.23
✎
13:14
|
а не, всё проще
ВЫБРАТЬ Поле1, Поле2 ИЗ ХХ ОБЪЕДИНИТЬ ВЫБРАТЬ Поле2, Поле1 ИЗ ХХ |
|||
23
Собеседница
20.02.23
✎
13:14
|
(12) спасибо!! не могла сообразить, как бы их раскидать, так получилось
|
|||
24
АгентБезопасной Нацио
20.02.23
✎
13:16
|
(20) но ведь в этом случае и "состав профиля Наименование профиля 2 совпадает с составом Профиль простой". И тогда {"Профиль Простой", "Профиль3"} и {"Профиль 3", "Профиль Простой"} надо считать различными.
поэтому нужно еще одно отношение, в парах. (21) будет три одинаковых - будет больше дублей (22) не поможет, если есть две "симметричых" строки |
|||
25
Said_We
20.02.23
✎
13:19
|
(22) Неа..., скорее всего. Ей наборы свойств одинаковые нужны. Т.е. найти Профиль у которого такой же набор свойств.
В классике такая задаче часто делается через STRING_AGG(). Но есть ограничение на длину собираемой строки. Но опят же решается через предварительную нумерацию всех вариантов свойств, т.е. оперируют не значениями свойств, а идентификаторами, либо временными идентификаторами. |
|||
26
Собеседница
20.02.23
✎
13:19
|
симметричные строки я выкинула раньше, если будет три одинаковых, то да, по ним будет три пары и три сообщения.
{"Профиль Простой", "Профиль3"} и {"Профиль 3", "Профиль Простой"} это считаются одинаковыми парами. один соответствует другому, в какой очередности, не важно, два одинаковых, выводим сообщение, пользователь правит. |
|||
27
Said_We
20.02.23
✎
13:21
|
(26) Плясать можно не от Профиля, а от перечня свойств. Тогда один перечень и несколько Профилей, которые такой перечень свойств имеют.
|
|||
28
Жан Пердежон
20.02.23
✎
13:22
|
всё норм итоговый вариант
ВЫБРАТЬ Поле1, Поле2 ИЗ ХХ ГДЕ Поле2>Поле1 ОБЪЕДИНИТЬ ВЫБРАТЬ Поле2, Поле1 ИЗ ХХ ГДЕ Поле1>Поле2 |
|||
29
magicSan
20.02.23
✎
13:23
|
(28) смотри (20)
внутренее по свйоствам , затем групируешь в профиль и считаешь количество свойст, |
|||
30
magicSan
20.02.23
✎
13:24
|
зате мизначальную сворачиваешь по профилю и сравниваешь две таблицы
|
|||
31
АгентБезопасной Нацио
20.02.23
✎
13:24
|
(26) так я про это и говорю, в таком случае "один соотвествует другому", а "другой соответствует первому". Если нет дополнительных правил, то это НЕ равнозначные строки.
(27) это если количество свойств фиксированно, и у всех профилей одинаково (28) и сверху - выбрать различные |
|||
32
Собеседница
20.02.23
✎
13:29
|
(28) да, так тоже можно. главное сообразить было, что можно сравнить их, чтоб упорядочить
|
|||
33
АгентБезопасной Нацио
20.02.23
✎
13:29
|
(29) а в общем виде?
Если: 1)неизвестно количество свойств 2)неизвестно количество свойств у каждой номенклатуры ? |
|||
34
Собеседница
20.02.23
✎
13:31
|
(31) количество свойство разное может быть
не могу понять, почему НЕ равнозначные строки? |
|||
36
АгентБезопасной Нацио
20.02.23
✎
13:33
|
(34) потому, что нет зависимости между Поле1 и Поле2 в кортеже. Как тольковводишь отношение порядка - так становятся одинаковыми
|
|||
37
АгентБезопасной Нацио
20.02.23
✎
13:34
|
(35) голосистую?
|
|||
38
magicSan
20.02.23
✎
13:35
|
(33) дак да в общем виде. У профилей разное количество свойств:
1. соединяешь по свойствам 2. смотришь количество свойств 3. сравниваешь с изначальнйо свернутой таблицой по количеству свойств. |
|||
39
Жан Пердежон
20.02.23
✎
13:38
|
(31) и так сойдет
|
|||
40
АгентБезопасной Нацио
20.02.23
✎
13:38
|
(38) засаду чувствую я....
|
|||
41
АгентБезопасной Нацио
20.02.23
✎
13:39
|
(39) делай П(рекрасно), Х(оть как нибудь) само получится. ©
|
|||
42
Said_We
20.02.23
✎
13:41
|
Ниже самый простой вариант в SQLite. GROUP_CONCAT() аналог функции STRING_AGG() в MS SQL.
WITH vt_data as ( select 'Профиль1' as p, 'Свойство1' as s UNION ALL select 'Профиль1', 'Свойство2' UNION ALL select 'Профиль1', 'Свойство3' UNION ALL select 'Профиль2', 'Свойство5' UNION ALL select 'Профиль3', 'Свойство1' UNION ALL select 'Профиль3', 'Свойство2' UNION ALL select 'Профиль4', 'Свойство1' UNION ALL select 'Профиль4', 'Свойство2' UNION ALL select 'Профиль5', 'Свойство1' UNION ALL select 'Профиль5', 'Свойство2' UNION ALL select 'Профиль6', 'Свойство3' UNION ALL select 'Профиль7', 'Свойство5' UNION ALL select 'Профиль8', 'Свойство2' ) SELECT t.s ,t.p FROM (SELECT t.s ,t.p ,count(t.p) over(partition by t.s) as kol from (SELECT t.p ,GROUP_CONCAT(t.s) as s FROM vt_data as t GROUP by t.p ) as t ) as t WHERE t.kol>1 РЕЗУЛЬТАТ: -------------------------------------- s p Свойство1,Свойство2 Профиль3 Свойство1,Свойство2 Профиль4 Свойство1,Свойство2 Профиль5 Свойство5 Профиль2 Свойство5 Профиль7 |
|||
43
Said_We
20.02.23
✎
16:20
|
(42) И да, опять же JOIN не используется.
Если свойств очень много, то можно для каждого Профиля рассчитать ХЕШ его свойств и уже собственно сравнивать по ним. Но на 1С только запросом это 100% не получится, только через предварительную обработку с подготовкой таблицы. |
|||
44
АгентБезопасной Нацио
20.02.23
✎
16:31
|
(43) ну по сути это корреляционный анализ запросом. Если КК=количеству свойств, то всё совпало. Но без курсора я, наверное, не смогу. если только окном.
|
|||
45
АгентБезопасной Нацио
20.02.23
✎
16:32
|
Хотя можно, но нужно допустить, что "свойств не более N"
|
|||
46
lEvGl
20.02.23
✎
16:52
|
ёпырст..
хэш свойств это сильно )) |
|||
47
АгентБезопасной Нацио
20.02.23
✎
16:56
|
(46) это изрядно ускорит.
|
|||
48
magicSan
20.02.23
✎
17:02
|
(42) ты пары профилей не выбрал - нужно вывести профили которые пересекаются.
|
|||
49
lEvGl
20.02.23
✎
17:02
|
несомненно ускорит
|
|||
50
Said_We
20.02.23
✎
17:38
|
(48) На этих простых данных и так думал видно, и не стал функцию DENSE_RANK() применять и отдельное поле добавлять с номером группы повтора "ngrup".
Профили: 3, 4, 5 это одна группа, где сразу три повторяющихся. Профили: 2, 7 это вторая группа с двумя повторяющимися профилями. SELECT dense_rank() over(order by t.s) as ngrup ,t.s ,t.p FROM... и т.д. тоже самое |
|||
51
Said_We
20.02.23
✎
17:38
|
ngrup s p
1 Свойство1,Свойство2 Профиль3 1 Свойство1,Свойство2 Профиль4 1 Свойство1,Свойство2 Профиль5 2 Свойство5 Профиль2 2 Свойство5 Профиль7 |
|||
52
magicSan
20.02.23
✎
17:54
|
(50) 1. нужно вывести кластер профилей которые обладают одинаковыми совйствами
2. твой лайт ту никому не упал его не пользуют - пиши sql |
|||
53
Said_We
20.02.23
✎
18:05
|
(52) Я же написал - в MS SQL тоже самое, только вместо GROUP_CONCAT() как в SQLite, MySQL, Oracle рисуем STRING_AGG() для MS SQL.
В Постгри можно примерно так array_to_string(array_agg(name),','), но точно не скажу по постгри - пробовать надо. |
|||
54
АгентБезопасной Нацио
20.02.23
✎
18:08
|
(42) все-таки тут ошибка в модели данных. Нужно не только "свойство", но и "значение свойства".
|
|||
55
Said_We
20.02.23
✎
18:12
|
(54) В (21) я спросил про тип, надеясь получить ответ, что там за значения и какого типа.
Не дождавшись привел пример для строк. STRING_AGG() в 1С тоже можно сделать, но с ограничением количества свойств. Если 10 раз попарно соединить строки, то получим 2^10 или 1024 отдельных значения. |
|||
56
Said_We
20.02.23
✎
18:16
|
(54) А реализация с ХЕШ проще в обслуживании :-)
Перед записью посчитал и сохранил. Далее не нужен геморрой и сложными запросами себя мучить. Не на много сложнее положить данные, но на порядок проще доставать. |
|||
57
Said_We
20.02.23
✎
18:38
|
(52) "нужно вывести кластер профилей которые обладают одинаковыми свойствами" - чем поле "ngrup" не устраивает?
|
|||
58
magicSan
20.02.23
✎
19:18
|
(57) ты не вывел, автор этого хотел. Смысла писать на чем что не рабоате в консоли 1с нету
|
|||
59
Said_We
20.02.23
✎
19:49
|
(58) Главное - суть решения. А SQL запросы все +- одинаковые. Переписать всегда можно. Только в 1С запросы километровые на простые вещи получаются. Проще в консоли самого SQL набросать. Что под рукой было, в том и набросал.
SQLite у меня всегда под рукой. В Линуксе он часть ОС можно сказать. |
|||
60
Остап Ибрагимович
20.02.23
✎
20:00
|
ВЫБРАТЬ
ВЫБОР КОГДА втПоля.Поле1 <= втПоля.Поле2 ТОГДА втПоля.Поле1 ИНАЧЕ втПоля.Поле2 КОНЕЦ КАК ПолеМин, ВЫБОР КОГДА втПоля.Поле1 <= втПоля.Поле2 ТОГДА втПоля.Поле2 ИНАЧЕ втПоля.Поле1 КОНЕЦ КАК ПолеМакс, СУММА(1) КАК Счетчик ИЗ втПоляПарами КАК втПоля СГРУППИРОВАТЬ ПО ВЫБОР КОГДА втПоля.Поле1 <= втПоля.Поле2 ТОГДА втПоля.Поле1 ИНАЧЕ втПоля.Поле2 КОНЕЦ, ВЫБОР КОГДА втПоля.Поле1 <= втПоля.Поле2 ТОГДА втПоля.Поле2 ИНАЧЕ втПоля.Поле1 КОНЕЦ |
|||
61
magicSan
20.02.23
✎
20:10
|
(59)в 1с запрос будет иметь столько же строк, не перегибай. (60) зачем ты третий раз перепечатываешь то что не рабоатет и не имеет смысла?
|
|||
62
Остап Ибрагимович
20.02.23
✎
20:14
|
(61):
1. Зачем ты врёшь что много раз - я один раз, из консоли. 2. Зачем ты врёшь что не работает? (работает - проверено в консоли) |
|||
63
magicSan
20.02.23
✎
20:23
|
(62) 1. (12) (28)
2. из пар профиль1 свойство1,профиль1 свойство2 ... профиль10 свойство11,профиль10 свойство12 . Необходимо вывести профили у которых одинаковые свойства. Чо там где у тебя работает? |
|||
64
Жан Пердежон
20.02.23
✎
20:29
|
(63) как это связано с тем что в (0)?
|
|||
65
Остап Ибрагимович
20.02.23
✎
20:29
|
(63): 1. (62) п.1.
2. из пар профиль1 свойство1,профиль1 свойство2 ... профиль10 свойство11,профиль10 свойство12. Выводятся одинаковые пары профиль+свойство со счетчиками таких одинаковых пар. Т.е. все работает. (ты не напрягайся, я понял что ты просто недопонимаешь)) |
|||
66
Остап Ибрагимович
20.02.23
✎
20:29
|
* выводятся уникальные пары
|
|||
67
magicSan
20.02.23
✎
20:33
|
(64) в (20)
|
|||
68
Жан Пердежон
20.02.23
✎
22:54
|
(67) в (20) уже другая задача
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |