2017-05-02 02:39 pm

window functions - краткая справка

Уже не первый раз просят дать какую-нибудь книжку по window functions.
Ирония состоит в том, что я такой книжки не знаю, но window functions реализовал руками когда писал СУБД.
Попробую сейчас написать небольшую статью, прочитав которую, скорей всего, вы будете "понимать" window functions без мучительного вычитывания стандарта и кучи текстов разной степени понятности.
Поехали


Любой window function состоит из
1) агрегационных функций
2) over (определения окна)

Агрегационные функции можно классицировать на
1а) "классические агрегаты" (sum, count)
1б) "аналитические агрегаты" (row_number, rank, dense_rank)

Определение окна состоит из
2а) partition by
2b) order by
2c) sliding window (опциональный) (rows between undounded preceding and current row как пример)

Как window functions влияет на остальной запрос:
- на выходе из window functions всегда ровно столько строчек, сколько на входе == "window functions проксирует вход"
- все конструкции из определения окна влияют ТОЛЬКО на вычисления агрегаттов
- НО! если у вас в запросе явно не указан order by (ЗА ПРЕДЕЛАМИ OVER!), то в полном соответствии с SQL стандартом, база может переупорядочить строчки так, чтобы window functions считались быстро, таким образом, порядок строчек в запросе с window functions МОЖЕТ отличаться от порядка строчек без него

Теперь рассмотрим вычисления агреггатов
Сначала применяется partition by, который группирует строчки по ключу partition by. Если в запросе нету внешнего order by (ЗА ПРЕДЕЛАМИ OVER!), то, скорей всего, строки в результате выполнения запроса будет сгруппированы (НО ЭТО НЕ ГАРАНТИРУЕТСЯ! и на это нельзя полагаться)

Оба типа агреггатов (классические и аналитические) считаются по отдельным parition (с одинаковым ключем)
Если partition by опущен - по всей выборке

Ну и последнее правило.
Всe агрегаты вычислются в рамках одного partition
- в соответствии с порядком order by ВНУТРИ over
- на подмножестве строк, ограниченном sliding winding.

У sliding window есть такая важная штука, как current row.
При выдаче строчки наружу из window function, current row - это текущая строчка из входа (смотрите выше правило "window functions проксирует вход")

sliding window бывают двух типов: rows и range

"rows" задает относительное смещение от current row
rows between unbounded preceding and current row - от начала текущего partition и до текущей строки
rows between 3 preceding and 3 following - минус 3 строки назад и плюс 3 строки вперед от текущей строки

range работает почти также, только он не просто "считает" строки, а он их "группирует" по ключу order by.
Если у вас идут повторяющиеся строки, то range - это такая дополнительная их группировка, и отсчет идет по группам строк, у которых значения в колонках из order by одинаковые

Собственно, все, через этот небольшой ряд правил и модель выполнения вы сможете разобраться в любом запросе с window functions и написать нужный вам

Правила разбора (сжато)
- на выходе будет столько же строк, сколько в запросе без window functions
- разберитесь c order by - он управляет порядком строк в sliding window (и НИЧЕГО не говорит про порядок в результате)
- разберитесь с sliding window (в случае range помните про order by)

Есть один красивый пример, который иллюстриует как внутренний order by не влияет на результат выполнения запроса так, как внешний order by

Если у вас есть запрос вида
OVER (ORDER BY c ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
скорей всего, оптимизатор развернет этот запрос в такой:
OVER (ORDER BY c DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

Т.е. СУБД "перевернет" окно, потому что preceding...current row считать проще, чем current row...following.
Во всяком случае, SyBase именно так делает

Это абсолютно легальная операция - поменять порядок order by и перевернуть окно
Но на выходе из запроса у вас порядок строк (при отсутствии внешнего order by) будет "перевернутым"
2011-10-09 05:47 pm

Удалённая работа

Начало поста - копипаста из журнала [livejournal.com profile] aka_rider

Удаленная работа, работа - мечта.
Поделюсь своим опытом об удаленной работе, постараюсь изложить максимум полезной и конструктивной информации. Понятно, что многие сказанные вещи базируются на субъективном мнении и восприятии, а вопросы, касающиеся законодательства привязаны к Украине (для России это +/- тоже самое), но думаю информация будет полезна всем, кто работает, или подумывает работать удаленно.

Пункт первый и самый важный: “Деньги”
Как получать деньги от заказчика? Работать как физ. лицо получится наврядли, в банке мне прямо сказали, что если я, будучи физ. лицом, получу деньги от юр. лица, да еще и в валюте, то платеж они арестуют. Даже если я плачу налог от сторонней прибыли, то банку проще предоставить мне возможность отчитываться за каждый платеж перед налоговой, чем делать это самим. Второй важный момент - назначение платежа: оплата услуг по разработке / интеграции / сопровождению / etc. ПО, согласно законодательству является частью предпринимательской деятельности, и без свидетельства незаконна. Таким образом, если мы хотим получать деньги честным путем, понадобится регистрация ИП (в Украине - СПД). Регистрация занимает “как повезет” времени (мне не повезло - 5 месяцев без копейки денег). Про процесс регистрации написано много и без меня, единственное что добавлю - лучше обратиться к фирме-регистратору и у нее же купить бухгалтерское сопровождение, стоит это недорого, но время экономит очень сильно. Через месяц-два после обращения к такой фирме, у вас на руках будет свидетельство частного предпринимателя (возможно налоговый инспектор захочет познакомиться с вами лично, тогда придется засветиться в налоговой и клятвенно пообещать что вы будете работать, а не отмывать деньги). Теперь с этим свидетельством можно идти в банк и открывать счет. Здесь все зависит от степени педерастичности конкретного банка (мне счет делали 3-4 месяца, а в процессе умудрились проебать мои заявки на оформление электронного ключа, да-да без клиент-банка со счетом работать не получится).
Если заказчик перечисляет деньги в валюте, то вам предстоит столкнуться с валютным контролем. Каждую перечисленную на счет сумму необходимо будет подтвердить копиями инвойсов и подписанным актом приема передачи выполненных работ. Хохма в том, что буржуи понятия не имеют что это за акт, так что скорее всего придется объяснять заказчику зачем подписывать эту бумажку. Если вы намерены работать с одним заказчиком долгосрочно, лучше всего прописать отдельным пунктом в контракте, что акт приема передачи выполненных работ будет подписан единоразово, по истечению срока действия контракта.
А, ну и деньги со счета ИП тоже просто так снять не получится, надо будет продавать валюту на межбанке, потом переводить деньги на другой счет, уже можно физ. лицу (это называется получение прибыли). По этому вопросу подробнее расскажут в банке.
Вот вроде бы все, что касается официальной части.

Место.
Когда я только-только готовился работать удаленно, я несказанно радовался экономии времени на дорогу: вот я встал, запарил овсяночку, заварил чаек и читаю почту, уже будучи на работе. По факту это со временем превратилось в форменный пиздец: я не мог расслабиться ни на секунду, я просыпался _уже_ на работе, засыпал _еще_ на работе, постоянно с испугом смотрел на Скайп. Очень важно отделять рабочее пространство от жилого. К сожалению я обитаю в однокомнатной квартире, поэтому физически разделить не получилось. Хотя со временем я заметил, что работаю я исключительно при включенной люстре (даже днем), а как только сажусь отдыхать, выключаю ее и включаю ночник. В психологии это называется “якорь” - привязка конкретной деятельности к чему-то. Но лучше иметь отдельное место для работы - комнату / кубик в co-working центре / что угодно.

Люди.
Неформального общения становится заметно меньше, но это не основная проблема. Возникают разного рода неприятности, связанные с физическим состоянием. Как-то у меня пропал интернет - единственный способ общения с заказчиком и закончились деньги на резервном GPRS модеме. В этот момент я лежал с простуженными почками и температурой 39, на работе по сей день думают что пару дней я тупо пробухал, хотя не пью я уже более 2-х лет, и ни одного дня работы из-за пьянки не пропустил. Хорошо бы такие варианты рассмотреть, чтобы на подхвате кто-нибудь из друзей был.

Время.
Этот самый коварный пункт я оставил напоследок. Казалось бы удаленная работа дает больше свободного времени - это не совсем так. Если вы думаете, что умеете управлять своим распорядком, но никогда не работали удаленно - скорее всего вы ошибаетесь. В обычном мире действует расписание, к которому поневоле привязываешься, в удаленной работе расписания нет. Приходится распределять время между работой / хобби / домашними делами / отдыхом / сном / социальными обязательствами, и вот тут-то и “улыбается пиздец своей улыбкой хищной”. День, ночь, дни недели с непривычки размазываются в веселом калейдоскопе, перестаешь понимать что к чему уже после первого месяца работы. Сначала конечно же рабочий день переходит в ночь, потом сталкиваешься с тем, что магазины по ночам почему-то не работают, в банке никто не берет трубку, знакомых не видно и т.д. В какой-то момент времени я начал спать по часу через каждые четыре, я себя к этому не приучал - график выбрала тушка, неудобство такого режима в том, что после 5-6ч бодрствования организм выключается самопроизвольно.
Плохая новость в том, что тайм-менеджмент давно превратился в отдельную науку, но усвоив ее, получаешь исключительный PROFIT. Это если получится конечно.

Со временем совокупность всех факторов может привести поначалу к хронической усталости, а потом к burnout’у: усталость выливается в плохие показатели, желание подчистить все хвосты и не быть мудаком в глазах коллег усугубляет усталость, затем апатия, падение самооценки, желание уйти из профессии навсегда (это защитная реакция мозга - на место “я не могу” он подставляет “мне неинтересно”), в худшем случае - больничка и транквилизаторы вперемешку с антидепрессантами. Я не напугать хочу, а предупредить. Предупрежден - значит вооружен.

Напоследок скажу, мне понадобилось всего-то 5 месяцев каникул (байдарки, горы, горы, байдарки, горы, фестивали, море) чтобы опять почувствовать в себе силы и главное - желание работать.

Ну что же? Бесценный опыт.
http://aka-rider.livejournal.com/32934.html

Добавление от меня

Отсутствие обратной связи
Ты не понимаешь, хорошо ты работаешь или плохо.
Ты не уверен, не пропустил ли ты чего-нибудь важного.
В офисе у тебя под рукой есть коллеги, и ты всегда получаешь непрерывный feedback - что ты сделал плохо, что хорошо, "завтра митинг с кастомером, приди пораньше".
На удалённой работе доступен лишь e-mail. В e-mail'е много писем (от 50 до 200-300 в день). Письма на английском. Их нужно все прочитать - чтобы бы уверенным, что ты ничего не пропустил.
Тебе сложно понять, хорошо ли ты работаешь. Если ты работаешь хорошо - то тебя не трогают, если плохо - обязательно придут и спросят. Но в итоге нету позитивного подкрепления.

"Провал" на выходные
На удалённой работе тем или иным образом ведётся учёт рабочей деятельности. По-хорошему при работе в офисе его тоже нужно вести, но там этой функцией обычно занимаются менеджеры - а линейные инженеры про это даже не задумываются.
У Юры [livejournal.com profile] aka_rider в Schooner учёт вёлся по задачам - нужно успеть сделать
У меня в Percona учёт ведётся по задачам + часам - нужно обязательно сделат А, Б, В а оставшиеся (40 - время на А-Б-В) часов делать менее приоритетные задачи.

В итоге в течении первого года у меня была фантастическая перестройка и ломка, вплоть до burn-out'а.
Как это выглядит:
"Время пятница вечер, а у меня всего лишь 32 рабочих часа за неделю/не закончена важная задача В" - работаем субботу чуть-чуть, воскресенье чуть-чуть.
Итог:
Выходные пропущены, следующую неделю ты работаешь менее эффективно и опять не успеваешь закончить до выходных

Выходных в итоге нет. За пару месяц такой активности ты проваливаешься в страшное переутомление.
За полгода - в burn-out.

При прочих равных удалённая работа после "перестройки" действильно ЛУЧШЕ.
Я СНАЧАЛА научился работать эффективно, и лишь ПОТОМ удалёнка стала для меня лучше.
Придётся научится работать и управлять свои временем:
1) отслеживать куда оно идёт
2) отслеживать сколько на что тратится
3) пресекать паразитную активность
4) планировать свои активности

Общение с коллегами
В офисе ты всегда можешь пойти и обсудить проблемы с человеком. На работе тебе приходится писать письма.
Чатики и прочее неэффективны - человек может отойти, занят важной задачей, беседовать с кем-то ещё.
Спасают периодические командировки на митинги.
Спасает грамотный менеджмент.
Но с психологическим дискомфортом ПРИДЁТСЯ научиться справляться. Перестроиться на почту. А это непросто - совершенно иной формат, и весь твой предыдущий опыт общения стоит мало чего.

Простая мысль на подумать: половина кандидатов принятых на испытательный срок не проходят его.
И тут причина, думаю, вовсе не в их компетенции.


О плюсах удалённой работы
Я больше никогда в жизни не буду работать в офисе. Причины:
1) Я могу жить в удобной мне стране, городе, районе города. Переезд не означает автоматически смену работы. А значит - я могу объективно оценить, где мне жить лучше. Аналогично со сменой работ ы- я оцениваю работу, а не как мне до неё добираться
2) Выше зарплата за счёт оптимизации расходов на тебя со стороны работодателя
3) Не трачу время на бессмысленную активность типа "доехать на работу"
4) Более эффективная рабочая деятельность - "отсиживать" часы не получится
5) Стимул постоянно оптимизировать свою деятельность и навыки. Я бы никогда не выучил emacs org-mode на работе в офисе :)
6) Гибкий график - всегда можно встретить друга на вокзале или взять внеплановый выходной.
7) Путешествия :) На митинги и конференции в другие страны.
8) Если тебя взяли на удалёнку - ты действительно нужен. Это в офисе не видно, как человек работает - а тут всё на лицо. Например, week report (что у нас обязательном порядке).
9) Учишься ценить своё время и узнаешь его реальную стоимость.

comment count unavailable