Strona Główna

Data Cleaning Pipeline

Od surowego zrzutu danych do gotowego raportu.
Case Study: Standaryzacja Globalnej Listy Płac.

1. Dane wejściowe (Raw Data)

Eksport z 3 różnych oddziałów firmy. Problemy: niespójne waluty, "śmieciowe" znaki w liczbach, błędy w pisowni nazwisk, braki w przypisaniu działów.

ID Employee_Name Salary_Raw Region Dept
1001 jan kowalski 5,000 $ USA IT Dev
1002 ANNA NOWAK 20.000 pln PL NULL
1003 Pierre Dubois 4.5k EUR FR Marketing
1001 jan kowalski 5000 USD USA IT
1004 John Smith TBD UK Sales
Błędy / Brudne dane Wartości puste (NULL)

2. Proces ETL (SQL Script)

Skrypt transformujący. Wykorzystuję CTE (Common Table Expressions) dla czytelności oraz funkcje okna do usuwania duplikatów.

/* Cel: Standaryzacja wynagrodzeń do PLN i czyszczenie danych osobowych.
   Autor: Adam Klimczak
*/

WITH Raw_Cleaned AS (
    SELECT 
        id,
        -- 1. Naprawa formatowania tekstu (usuwanie spacji, Wielkie Litery)
        INITCAP(TRIM(employee_name)) AS clean_name,
        
        region,
        
        -- 2. Uzupełnianie braków w działach
        COALESCE(dept, 'Unassigned') AS dept_fixed,

        -- 3. Logika wyciągania liczb z tekstu (np. '4.5k' -> 4500)
        salary_raw,
        CASE 
            WHEN salary_raw LIKE '%k%' THEN 
                CAST(REGEXP_REPLACE(salary_raw, '[^0-9.]', '') AS DECIMAL(10,2)) * 1000
            WHEN salary_raw = 'TBD' THEN NULL
            ELSE 
                CAST(REGEXP_REPLACE(salary_raw, '[^0-9.]', '') AS DECIMAL(10,2))
        END AS salary_numeric,
        
        -- Wykrywanie waluty na podstawie kolumny lub suffixu
        CASE 
            WHEN salary_raw LIKE '%$%' OR region = 'USA' THEN 'USD'
            WHEN salary_raw LIKE '%EUR%' OR region = 'FR' THEN 'EUR'
            ELSE 'PLN' 
        END AS currency_detected,
        
        -- 4. Funkcja okna do oznaczania duplikatów (bierzemy najnowszy rekord)
        ROW_NUMBER() OVER(PARTITION BY id ORDER BY region DESC) as row_num
    FROM raw_payroll_import
),

Final_Calculation AS (
    SELECT 
        id,
        clean_name,
        dept_fixed,
        
        -- 5. Przeliczenie wszystkiego na PLN (kursy sztywne dla demo)
        CASE 
            WHEN currency_detected = 'USD' THEN salary_numeric * 3.95
            WHEN currency_detected = 'EUR' THEN salary_numeric * 4.30
            ELSE salary_numeric 
        END AS salary_pln_total
    FROM Raw_Cleaned
    WHERE row_num = 1 -- Odrzucamy duplikaty
      AND salary_numeric IS NOT NULL -- Odrzucamy rekordy bez stawki (TBD)
)

SELECT * FROM Final_Calculation
ORDER BY salary_pln_total DESC;

3. Wynik (Clean Dataset)

Dane gotowe do analizy. Zwróć uwagę na ujednolicone nazwiska, przeliczone kwoty i brak duplikatów (Jan Kowalski występuje raz).

ID Clean_Name Dept_Fixed Salary_PLN (Total) Data_Quality
1002 Anna Nowak Unassigned 20 000.00 ✔ VERIFIED
1001 Jan Kowalski IT Dev 19 750.00 ✔ DEDUPED
1003 Pierre Dubois Marketing 19 350.00 ✔ CONVERTED