Розв’язання реальних проблем за допомогою SQL

У моєму попередньому блозі я обговорював деякі складні запити, які часто задають на співбесідах, а також ті, які аналітики даних часто пишуть у своїй повсякденній роботі, розв'язуючи реальні проблеми.
У цьому блозі ми розглянемо рішення подібних типів проблем, використовуючи приклад даних про продажі.

pic

pic

Запит 1: Загальний дохід за регіонами

Мета: Обчислити загальний дохід для кожного регіону.

SELECT Region, SUM(Revenue) AS TotalRevenue  
FROM Sales GROUP BY Region ORDER BY TotalRevenue DESC;

pic

Запит 2: Кумулятивний дохід за місяцями

Мета: Обчислити кумулятивний дохід за всіма місяцями для кожного регіону.

SELECT Region, Month, Revenue,   
 SUM(Revenue) OVER (PARTITION BY Region ORDER BY Month) AS CumulativeRevenue  
Читати далі

(Простий) шлях з SQL — #6: Оволодіння MERGE для операцій з великими обсягами даних

Коли працюєш з великими обсягами даних у SQL, часто виникають ситуації, коли потрібно вирішити, чи оновлювати існуючі записи, чи додавати нові. Команда MERGE надає ефективний спосіб вирішення цього завдання, поєднуючи функціональність команд INSERT та UPDATE в одній операції.

Однак, продуктивність може стати викликом у таких випадках. Непотрібні сканування індексів, надмірне блокування або великомасштабні міграції даних можуть значно уповільнити процес. У цій статті ми розглянемо, як:

  • Використовувати MERGE для операцій з великими обсягами даних.
  • Застосовувати тимчасові таблиці для покращення продуктивності.
  • Оптимізувати оновлення та вставки в основну таблицю за допомогою первинних ключів для досягнення максимальної ефективності.

Об’єднання даних великого обсягу

Читати далі

Вступ до Apache Spark

pic

Вступ до Apache Spark

Розуміння архітектури Spark

В основі Apache Spark лежить потужна архітектура, спроектована для ефективної обробки великих даних. Spark працює на кластері машин, використовуючи архітектуру майстер-раб, де майстер-нод контролює кластер і координує розподіл задач, а робочі ноди виконують обчислення. Ця структура дозволяє Spark використовувати розподілені обчислення, що забезпечує швидку обробку величезних обсягів даних.

pic

https://go.tdaa.link/WhatsApp

Ключовим компонентом дизайну Spark є Resilient Distributed Dataset (RDD). RDD забезпечує надійний і паралельний обробний механізм, що гарантує цілісність даних навіть під час апаратних відмов. Ця стійкість є критично важливою для фахівців з даних і інженерів, які покладаються на послідовну обробку даних.
RDD дозволяють … Читати далі

Гібридне та динамічне багатокористувацьке розгортання баз даних з Ruby on Rails

У цьому пості ми поділимося досвідом впровадження гібридної та динамічної системи багатокористувацьких баз даних для одного з проектів, до якого ми залучені. Якщо ви не знайомі з будь-якими з цих понять, не хвилюйтеся — ми розглянемо їх детально.

Розуміння багатокористувацьких баз даних

Щоб краще зрозуміти багатокористувацькі бази даних, давайте спершу подивимось на однотипне розгортання, яке є його протилежністю.

Однокористувацьке розгортання

Однокористувацьке розгортання — це архітектура програмного забезпечення, в якій кожен клієнт (орендар) має окремий екземпляр програмного забезпечення разом із власною базою даних. Цей підхід забезпечує ізоляцію між клієнтами, але вимагає більших ресурсів та додаткових витрат на обслуговування.

Багатокористувацьке розгортання

Багатокористувацьке … Читати далі

Як парсити ідентифікатори працівників, що конкатеновані з іменами, за допомогою SQL

У моїй таблиці бази даних було поле зі значеннями у форматі:

Ім'я працівника (Ідентифікатор працівника)

І мені потрібно було витягнути лише Ідентифікатор працівника.

Наприклад, якщо значення було “Viktor Vektor (277)”, то я хотів отримати “277”.

Це рішення я моделював подібно до попередньої публікації, де я розглядав отримання імені файлу (без розширення) в SQL.

Ключові поля — перше (щоб побачити, як виглядають приклади даних) і останнє.

Рішення

SELECT  
 myTable.employeeNameAndId  
 , CHARINDEX('(', myTable.employeeNameAndId) AS positionOpenParenthesis  
 , CHARINDEX(')', myTable.employeeNameAndId) AS positionCloseParenthesis   
 , CASE WHEN  
 CHARINDEX('(', myTable.employeeNameAndId) > 0  
 AND CHARINDEX(')', myTable.employeeNameAndId) > 0  
 THEN  
 SUBSTRING(myTable.employeeNameAndId  
 , CHARINDEX('(', myTable.employeeNameAndId) + 1  
 , CHARINDEX(')', 
Читати далі

Clean Architecture: що це таке? Архітектурний дизайн з .NET Core

Ласкаво просимо до серії статей, в яких я пишу про C# та ASP.NET. Сподіваюся, вони будуть корисними і знайдуть свого читача. Приємного читання. 😊

pic

Clean Architecture (Чиста Архітектура) — це підхід до архітектури програмних проєктів, який забезпечує гнучкість, тестуваність та стійкість. Цю архітектуру у 2012 році представив Роберт С. Мартін (Uncle Bob), і вона дозволяє зосередити увагу на бізнес-логіці проєкту та правильно управляти залежностями. У цій статті ми детально розглянемо концепцію Clean Architecture, її основні принципи та те, як її реалізувати за допомогою .NET Core. Також на реальних прикладах коду ми покажемо, як на практиці застосовувати чисту архітектуру.… Читати далі

Створення гри в жанрі Tower Defense, день 7

Сьогодні я зосереджусь на створенні системи здоров'я для турелей.
Вони, по суті, зможуть отримувати пошкодження, і коли їх здоров'я закінчиться, вони будуть знищені, а місце для розміщення, на якому вони перебували, знову стане доступним.

pic

Спочатку я створив новий скрипт, який відповідає за здоров'я турелі та забезпечує, щоб місце для турелі стало доступним після її знищення.

pic

pic

Я також реалізував інший метод для обробки того, що відбувається, коли турель видаляється.

pic

Далі я зробив так, щоб мій ворог активував колайдер здоров'я турелі та використовував публічний метод атаки.

pic

Я також вирішив додати кінцеву машину станів (Finite State Machine) для штучного інтелекту, щоб все було … Читати далі

Покращення продуктивності .NET: як заміна виключень на результати може пришвидшити ваші додатки

pic

Ви будуєте високопродуктивні Web API з .NET 8? Ви помічаєте несподівані уповільнення, особливо при обробці поширених помилок? Тоді, можливо, ви надто сильно покладаєтесь на виключення, і настав час змінити підхід! Ця стаття глибше розглядає, як використання Result Pattern може значно покращити продуктивність вашого API, уникнувши витрат на обробку виключень.

Пастка виключень: коли помилки — це очікувані, а не виняткові ⚠️

Ми всі через це проходили. Користувач подає некоректні дані, запитуваний ресурс не знайдений, або відбувається збій у підключенні до бази даних. Це очікувані помилки, і в багатьох додатках вони трапляються досить часто. Традиційно розробники часто використовують виключення для обробки … Читати далі

Перестаньте писати зайві блоки catch — використовуйте фільтри виключень у C#!

🚀 Чому важливо використовувати Multi-Catch

У розробці на C# та .NET обробка виключень є критично важливою для створення надійних та безпомилкових додатків. Правильна обробка виключень не тільки покращує читабельність коду, але й спрощує відлагодження та підтримку.

Однією з поширених ситуацій, з якою стикаються розробники, є управління кількома типами виключень для одного блоку коду. Традиційно це вимагає написання окремих блоків catch для кожного виключення, що призводить до надмірності в коді. Однак з впровадженням фільтрів виключень у C# 6.0, цей процес можна значно спростити.

⚡ Проблема загальної обробки виключень

Обробка помилок за допомогою загальних виключень (catch(Exception)) може здатися швидким рішенням, … Читати далі

Найпростіше пояснення рекурсії в C#

Алгоритми рекурсії не дуже популярні в продукційному коді. Головна причина — рекурсія має чимало обмежень. Але якщо вона вам потрібна, ви повинні чітко розуміти, як вона працює, та як уникнути можливих обмежень.

Рекурсія в C# — це метод, який викликає сам себе прямо або опосередковано для вирішення задачі. Це чітке визначення, але як розробник, чи впевнені ви, що розумієте, як це працює?

Давайте розглянемо класичний приклад реалізації рекурсії — обчислення факторіала.
Код виглядатиме ось так:

long Factorial(int n)  
{  
 if (n == 0)  
 return 1;  
 return n * Factorial(n - 1);  
}

У C# рекурсія залежить від стеку викликів для … Читати далі