Задачка на SQL
Apr. 28th, 2011 10:32 amКоллеги задали задачку — элегантного решения не нашёл, а в лоб она до второго пришествия считаться будет, есть ли у кого идеи?
Дано: таблица из двух колонок — номер группы и номер несчастного случая.
Найти: идентичные группы, то есть группы, у которых полностью совпадают несчастные случаи.
Для простоты можно предположить, что один несчастный случай не может входить в одну группу более одного раза.
В принципе, не обязательно решать эту задачу на SQL, любые (практически реализуемые) варианты приветствуются.
Дано: таблица из двух колонок — номер группы и номер несчастного случая.
Найти: идентичные группы, то есть группы, у которых полностью совпадают несчастные случаи.
Для простоты можно предположить, что один несчастный случай не может входить в одну группу более одного раза.
В принципе, не обязательно решать эту задачу на SQL, любые (практически реализуемые) варианты приветствуются.
no subject
Date: 2011-04-28 08:40 am (UTC)no subject
Date: 2011-04-28 09:32 am (UTC)no subject
Date: 2011-04-28 10:05 am (UTC)Довольно часто встречающаяся задача в реальной статистике.
no subject
Date: 2011-04-28 08:41 am (UTC)Я бы сжал таблицу до такой: в первой колонке номер группы (уникальный), во второй - отсортированный список случаев (скажем, это строка со номерами случаев через запятую). Это двухпроходная операция (второй проход нужен для сортировки случаев внутри группы). Затем нашел бы дубликаты во второй колонке (например, отсортировав бы их, но, думаю, SQL это умеет и так).
no subject
Date: 2011-04-28 08:53 am (UTC)no subject
Date: 2011-04-28 09:33 am (UTC)no subject
Date: 2011-04-28 09:33 am (UTC)Спасибо :-)
no subject
Date: 2011-04-28 09:40 am (UTC)no subject
Date: 2011-04-28 08:51 am (UTC)В упрощённом виде:
1. извлекаем полную таблицу.
2. сортируем по двум колонкам: сперва по номеру группы, потом по номеру несчастного случая.
3. Хешируем: проходя по таблице, конкатенируем номер НС в аккумулятор. На строчках, для которых следующий номер группы не равен текущему, вписываем значение аккумулятора (хеша) в хеш-колонках во все предыдущие строки данной группы и обнуляем аккумулятор.
4. Сортируем по двум колонкам: сперва по хешу, потом по номеру группы.
5. Проходим по всем строкам: там, где значения хеша одинаковы для двух последовательных строк, а номер группы - нет, добавляем номера групп в искомую табличку совпадений.