green_fr: (Default)
[personal profile] green_fr
Коллеги задали задачку — элегантного решения не нашёл, а в лоб она до второго пришествия считаться будет, есть ли у кого идеи?

Дано: таблица из двух колонок — номер группы и номер несчастного случая.
Найти: идентичные группы, то есть группы, у которых полностью совпадают несчастные случаи.

Для простоты можно предположить, что один несчастный случай не может входить в одну группу более одного раза.

В принципе, не обязательно решать эту задачу на SQL, любые (практически реализуемые) варианты приветствуются.

Date: 2011-04-28 08:40 am (UTC)
From: [identity profile] mopexod.livejournal.com
Отсортировать по несчастному случаю и сгруппировать? Или я чего-то не понял?

Date: 2011-04-28 09:32 am (UTC)
From: [identity profile] green-fr.livejournal.com
Есть группа 1, в ней несчастные случаи A, B и C. Есть группа 2, в ней случаи B, C и D. Отстортировали, и как дальше?

Date: 2011-04-28 10:05 am (UTC)
From: [identity profile] mopexod.livejournal.com
Там [livejournal.com profile] fima уже все за меня написал про сжимание таблицы и отсортированные случаи :)
Довольно часто встречающаяся задача в реальной статистике.

Date: 2011-04-28 08:41 am (UTC)
From: [identity profile] fima.livejournal.com
Много ли в группе случаев, в среднем?
Я бы сжал таблицу до такой: в первой колонке номер группы (уникальный), во второй - отсортированный список случаев (скажем, это строка со номерами случаев через запятую). Это двухпроходная операция (второй проход нужен для сортировки случаев внутри группы). Затем нашел бы дубликаты во второй колонке (например, отсортировав бы их, но, думаю, SQL это умеет и так).

Date: 2011-04-28 08:53 am (UTC)
a_p: (Default)
From: [personal profile] a_p
хехе! (см. мой коммент ниже :)

Date: 2011-04-28 09:33 am (UTC)
From: [identity profile] green-fr.livejournal.com
И тебе спасибо :-)

Date: 2011-04-28 09:33 am (UTC)
From: [identity profile] green-fr.livejournal.com
Гениально!
Спасибо :-)

Date: 2011-04-28 09:40 am (UTC)

Date: 2011-04-28 08:51 am (UTC)
a_p: (Default)
From: [personal profile] a_p
я бы просто захешировал список несчастных случаев для каждой группы (если обе колонки проиндексированы, это делается в один проход). После этого, опять же проиндексировав колонку с хешем и пройдя по ней в порядке индекса (опять же - в один проход) выделяется список повторяющихся величин.

В упрощённом виде:
1. извлекаем полную таблицу.
2. сортируем по двум колонкам: сперва по номеру группы, потом по номеру несчастного случая.
3. Хешируем: проходя по таблице, конкатенируем номер НС в аккумулятор. На строчках, для которых следующий номер группы не равен текущему, вписываем значение аккумулятора (хеша) в хеш-колонках во все предыдущие строки данной группы и обнуляем аккумулятор.
4. Сортируем по двум колонкам: сперва по хешу, потом по номеру группы.
5. Проходим по всем строкам: там, где значения хеша одинаковы для двух последовательных строк, а номер группы - нет, добавляем номера групп в искомую табличку совпадений.

Profile

green_fr: (Default)
green_fr

December 2025

S M T W T F S
 1 2 3 4 56
7 8 9 10 11 1213
14 15 16 17 18 1920
212223242526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 1st, 2026 07:00 am
Powered by Dreamwidth Studios