Голосуй сердцем!

Mar 07, 2010 23:32


Знаете ли вы, что такое голосующая функция?
Вот летит, к примеру, ядрёная бомба. И на ней три датчика. Два говорят, что мы над Парижем, а один - над Нью-Йорком. Объявляется всеобщее тайное голосование, бортовой компьютер решает, что мы над Парижем и продолжает полёт в сторону цели.
Другой пример, более приземлённый. Хочу я познакомиться с девушкой, но спросить имя стесняюсь. Начинаю опрашивать знакомых. Двое говорят, что она Маша, а четверо - что Катя. Маша, это, конечно Маша, но четыре раза - это четыре раза. И поэтому в следующий раз, встретив её, я улыбнусь, и скажу: «Привет, Катя!» И не дай б~г она окажется-таки Машей…
Причём здесь Oracle, спросите вы? А при том, что недавно встретилась мне задача очистки данных. С нескольких источников приходит разрозненная информация о клиенте. Ну, например, имя, количество детей и дата рождения. Что касается имени, то источнику № 1 мы верим безоговорочно. Количество детей берём максимальное из известных. А вот по дате рождения устраиваем голосование: если трое скажут «25 января», а один - «13 февраля», то выскочка должен быть проигнорирован. Прелесть решения в том, что таблица с исходными данными читается и группируется один раз. Те, кто далёк от информационных технологий, просто поверьте, что это круто, а остальные -

select id, max(case when source_id=1 then name end) as name, max(nchildren) as nchildren, max(birth_dt) keep (dense_rank first order by birth_dt$qty desc) as birth_dt from ( select id, source_id, nchildren, birth_dt, row_number() over(partition by id order by birth_dt) - rank() over (partition by id order by birth_dt) as birth_dt$qty from client ) group by id

программистское, ЭВМ, валенки, oracle

Previous post Next post
Up