Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 138новых вакансий за сутки·93 809вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 271
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 229
  • Облачные технологии14 182
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии996
  • AI вакансии955
  • Frontend вакансии754
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 596
  • Node.js2 036
  • .NET1 740
  • Kotlin1 618
  • Rust1 473
  • C#719
  • PHP690
  • C++580

DevOps и инфраструктура

  • Kubernetes7 788
  • DevOps вакансии6 103
  • Linux-инфраструктура5 508
  • Terraform / IaC4 290
  • CI/CD3 280
  • Мониторинг и Observability1 791
  • SRE566
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 142
  • Бизнес-аналитик923
  • Аналитик данных859
  • Системный аналитик154

Другие направления

  • Проджект-менеджер623
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 156
  • Вакансии в Европе24 035
  • Вакансии в Канаде4 532
  • Работа в России3 865

По формату

  • Удалённые вакансии74 994
  • Релокация в США44 154
  • Гибридная работа12 489
  • Офисная работа7 090

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 958
  • Junior вакансии6 709

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме PostgreSQLВсе вопросы
PostgreSQLMiddleКодинг

Что такое window functions (OVER (PARTITION BY ... ORDER BY ...))? Чем ROW_NUMBER, RANK, DENSE_RANK отличаются?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Window functions вычисляют значения для каждой строки с учётом соседних строк в «окне». ROW_NUMBER всегда уникален, RANK пропускает номера при дублях, DENSE_RANK — нет.

Что такое window function

Window function — это функция, которая выполняет вычисление над набором строк (окном), связанных с текущей строкой, не сворачивая их в одну. В отличие от GROUP BY, все исходные строки остаются в результате.

SELECT
    id,
    company_id,
    salary,
    AVG(salary) OVER (PARTITION BY company_id) AS avg_company_salary,
    salary - AVG(salary) OVER (PARTITION BY company_id) AS diff_from_avg
FROM jobs
ORDER BY company_id, salary DESC;

Window Functions в PostgreSQL

Синтаксис OVER

функция() OVER (
    [PARTITION BY col1, col2]  -- разбивка на группы
    [ORDER BY col3 [ASC|DESC]]  -- порядок внутри группы
    [frame_clause]              -- ROWS/RANGE BETWEEN ...
)

ROW_NUMBER

Присваивает уникальный последовательный номер каждой строке в разделе. При одинаковых значениях порядок произвольный (если ORDER BY не полностью детерминирован).

SELECT
    id,
    title,
    company_id,
    salary,
    ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY salary DESC) AS rn
FROM jobs;
-- Для зарплат: 5000, 5000, 3000 -> 1, 2, 3

Применение: получить первую N строк в каждой группе (TOP-N per group):

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY salary DESC) AS rn
    FROM jobs
) t
WHERE rn <= 3;

RANK

Присваивает ранг с пропусками. При одинаковых значениях одинаковый ранг, следующий ранг — с пропуском.

SELECT
    title,
    salary,
    RANK() OVER (ORDER BY salary DESC) AS rnk
FROM jobs;
-- Для зарплат: 5000, 5000, 3000 -> 1, 1, 3  (2 пропущен)

DENSE_RANK

Присваивает ранг без пропусков. При одинаковых значениях одинаковый ранг, следующий ранг — без пропуска.

SELECT
    title,
    salary,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM jobs;
-- Для зарплат: 5000, 5000, 3000 -> 1, 1, 2  (без пропуска)

Другие полезные window functions

SELECT
    id,
    created_at,
    salary,
    LAG(salary) OVER (PARTITION BY company_id ORDER BY created_at) AS prev_salary,
    LEAD(salary) OVER (PARTITION BY company_id ORDER BY created_at) AS next_salary,
    FIRST_VALUE(salary) OVER (PARTITION BY company_id ORDER BY salary DESC) AS max_salary,
    NTILE(4) OVER (ORDER BY salary) AS quartile,
    PERCENT_RANK() OVER (ORDER BY salary) AS pct_rank
FROM jobs;

Frame clause

-- Скользящая сумма за последние 7 дней
SELECT
    created_at::date AS day,
    COUNT(*) AS daily_jobs,
    SUM(COUNT(*)) OVER (
        ORDER BY created_at::date
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS rolling_7d
FROM jobs
GROUP BY created_at::date
ORDER BY day;

Подводные камни

  • Window functions выполняются после WHERE и GROUP BY, но до ORDER BY и LIMIT — нельзя фильтровать по результату window function в WHERE, нужен подзапрос или CTE.
  • ROW_NUMBER с неполным ORDER BY (без уникальных колонок) даёт недетерминированный результат — строки с одинаковыми значениями могут получать разные номера при каждом выполнении.
  • RANGE (по умолчанию) и ROWS ведут себя по-разному: RANGE смотрит на значения, ROWS — на физические строки. При ORDER BY без frame_clause используется RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW — это учитывает все строки с таким же значением, что неожиданно для SUM.
  • Большое количество PARTITION BY разделов с малым числом строк работает медленно — PostgreSQL создаёт отдельный sort для каждого окна.
  • Несколько window functions с разными OVER могут быть объединены в один проход через WINDOW-clause:
SELECT salary,
    ROW_NUMBER() OVER w,
    RANK() OVER w
FROM jobs
WINDOW w AS (PARTITION BY company_id ORDER BY salary DESC);
  • LAG/LEAD возвращают NULL для первой/последней строки раздела — используйте третий аргумент (default value) если NULL неприемлем.
  • Window functions несовместимы с DISTINCT — придётся использовать подзапрос.

Типичные ошибки

  • Путать window function с GROUP BY.
  • Не задавать tie-breaker в ORDER BY.
  • Ожидать, что RANK и DENSE_RANK одинаковы.

Что проверяет интервьюер

  • Просит top-1 order per user.
  • Проверяет разницу рангов на одинаковых значениях.
  • Уточняет стоимость сортировки в плане.

Как вы знаете этот вопрос?

Проверить себя по теме PostgreSQL →

Источники

  • https://www.postgresql.org/docs/current/tutorial-window.html
←Предыдущий вопросЧто такое dirty read, non-repeatable read, phantom read, serialization anomaly? Какие из них возможны на каком уровне?Следующий вопрос→Каковы стратегии партиционирования таблиц в PostgreSQL (range, list, hash)?

Связанные темы

PostgreSQLanalytics-sqlsql-querying

Вакансии с этим навыком

PostgreSQL вакансии
  • Go Architect (Fintech)
  • Fullstack Developer (Java Core & React)
  • Sr Software Engineer - Remote
  • Sr Full Stack Developer-Web Technology
  • Principal Software Engineer (Application Software)

Частые вопросы на собеседовании

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?