В этой шпаргалке собраны функции MySQL, применяемые для получения отдельных компонентов даты и времени: года, месяца, дня, часов, минут, секунд, номера недели и дня недели. Эти операции используются в большинстве рабочих запросов — от фильтрации и группировки данных до подготовки отчётов и временной аналитики.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🤝9❤7
UNNEST + WITH ORDINALITY — управляемая распаковка массивов в PostgreSQL!
Обычный
В PostgreSQL есть решение —
Пример: распакуем массив ингредиентов с сохранением порядка:
В отличие от обычного
Соберём обратно отсортированный список:
Работа с JSON-массивами:
🔥 Используйте
➡️ SQL Ready | #практика
Обычный
UNNEST() не сохраняет позицию элемента, что критично, когда важен порядок: восстановление списков, сортировка, работа с JSON-массивами.В PostgreSQL есть решение —
WITH ORDINALITY. Оно добавляет индекс элемента прямо при распаковке.Пример: распакуем массив ингредиентов с сохранением порядка:
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY AS t(ingredient, ord);
В отличие от обычного
UNNEST(), здесь мы сразу получаем порядковый номер — без оконных функций и без дополнительных JOIN.Соберём обратно отсортированный список:
SELECT recipe_id,
STRING_AGG(ingredient, ', ' ORDER BY ord) AS ordered_list
FROM (
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY t(ingredient, ord)
) q
GROUP BY recipe_id;
Работа с JSON-массивами:
SELECT order_id,
item ->> 'name' AS name,
item ->> 'price' AS price,
ord
FROM orders,
jsonb_array_elements(items) WITH ORDINALITY AS t(item, ord);
WITH ORDINALITY в PostgreSQL, когда критична позиция элемента в массиве или JSON-списке.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤8🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь быстро вспомнить команды для запросов, объединений таблиц или операций с данными? На этом сайте найдёшь множество готовых подсказок. Отлично подойдёт, если учишь SQL, готовишься к собесу или просто не хочешь каждый раз гуглить синтаксис.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥7
👍11🔥9❤8🤝1
GENERATE_SERIES превращает PostgreSQL в гибкий источник диапазонов: дат, чисел, временных интервалов без таблиц и вспомогательных скриптов.В сегодняшнем гайде:
• Строим календарь напрямую в запросе;
• Закрываем пропуски в отчётах и логах;
• Генерируем тестовые данные и последовательности для расчётов;
• Создаём временные ряды и интервалы.
Приём, который экономит время, упрощает аналитику и делает запросы выразительнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8❤7🤝2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤10🔥9🤝1
В этой шпаргалке собраны функции MySQL для сложения, вычитания и преобразования временных интервалов, а также для вычисления разницы между моментами времени. Эти операции применяются при расчёте длительностей, сроков истечения, аналитике пользовательских сессий, построении временных окон и обработке событийных данных.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤10🔥10
Нужно сделать очередь задач, чтобы несколько воркеров могли брать задания параллельно?
Сделаем атомарный захват задачи:
Если задача взята, она возвращается. Если другой воркер схватил её раньше —
Можно добавить таймаут на незавершённые задачи:
🔥 Это превращает таблицу в настоящую надёжную очередь.
➡️ SQL Ready | #совет
FOR UPDATE SKIP LOCKED — флаг, который позволяет захватить строку, а занятые другими процессами — пропустить, не ожидая их.SELECT id
FROM jobs
WHERE taken_at IS NULL
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;
Сделаем атомарный захват задачи:
UPDATE jobs
SET taken_at = now()
WHERE id = ( ... тот самый SELECT ... )
RETURNING *;
Если задача взята, она возвращается. Если другой воркер схватил её раньше —
SELECT просто пропустит её.Можно добавить таймаут на незавершённые задачи:
WHERE taken_at IS NULL
OR taken_at < now() - interval '5 minutes'
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤9👍8
MVCC объясняет, почему строки в базе не перезаписываются, а накапливают версии и почему таблица может расти, даже если количество записей не изменилось. Сегодня в гайде:
• Как возникают версии строк при UPDATE;
• Почему длинные транзакции удерживают старые данные;
• Откуда появляется bloat и как он влияет на индексы.
Эта механика напрямую влияет на производительность, видимость данных и работу
VACUUM под нагрузкой.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19🤝9👍7