Funcții analitice

Funcții pentru manipularea datelor în SQL Server

Ana Voicu

Data Engineer

FIRST_VALUE()

FIRST_VALUE(numeric_expression) 
    OVER ([PARTITION BY column] ORDER BY column ROW_or_RANGE frame)
  • Returnează prima valoare dintr-un set ordonat.

Componentele clauzei OVER

Component Status Description
PARTITION by column opțional împarte setul de rezultate în partiții
ORDER BY column obligatoriu ordonează setul de rezultate
ROW_or_RANGE frame opțional stabilește limitele partiției
Funcții pentru manipularea datelor în SQL Server

LAST_VALUE()

LAST_VALUE(numeric_expression) 
    OVER ([PARTITION BY column] ORDER BY column ROW_or_RANGE frame)
  • Returnează ultima valoare dintr-un set ordonat.
Funcții pentru manipularea datelor în SQL Server

Limitele partiției

RANGE BETWEEN start_boundary AND end_boundary
ROWS BETWEEN start_boundary AND end_boundary
Boundary Description
UNBOUNDED PRECEDING primul rând din partiție
UNBOUNDED FOLLOWING ultimul rând din partiție
CURRENT ROW rândul curent
PRECEDING rândul anterior
FOLLOWING rândul următor
Funcții pentru manipularea datelor în SQL Server

Exemplu FIRST_VALUE() și LAST_VALUE()

SELECT
    first_name + ' ' + last_name AS name,
    gender,
    total_votes AS votes,    
    FIRST_VALUE(total_votes) 
    OVER (PARTITION BY gender ORDER BY total_votes) AS min_votes,
    LAST_VALUE(total_votes) 
        OVER (PARTITION BY gender ORDER BY total_votes 
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS max_votes
FROM voters;
| name            | gender | votes | min_votes | max_votes |
|-----------------|--------|-------|-----------|-----------|
| Michele Suarez  | F      | 20    | 20        | 189       |
| ...             | ...    | ...   | 20        | 189       |
| Marcus Jenkins  | M      | 16    | 16        | 182       |
| Micheal Vazquez | M      | 18    | 16        | 182       |
Funcții pentru manipularea datelor în SQL Server

LAG() și LEAD()

LAG(numeric_expression) OVER ([PARTITION BY column] ORDER BY column)

  • Accesează date dintr-un rând anterior din același set de rezultate.

LEAD(numeric_expression) OVER ([PARTITION BY column] ORDER BY column)

  • Accesează date dintr-un rând următor din același set de rezultate.
Funcții pentru manipularea datelor în SQL Server

Exemplu LAG() și LEAD()

SELECT 
    broad_bean_origin AS bean_origin,
    rating,
    cocoa_percent,
    LAG(cocoa_percent) OVER(ORDER BY rating ) AS percent_lower_rating,
    LEAD(cocoa_percent) OVER(ORDER BY rating ) AS percent_higher_rating
FROM ratings
WHERE company = 'Felchlin'
ORDER BY rating ASC;
| bean_origin        | rating | cocoa_percent | percent_lower_rating | percent_higher_rating |
|--------------------|--------|---------------|----------------------|-----------------------|
| Grenada            | 3      | 0.58          | NULL                 | 0.62                  |
| Dominican Republic | 3.75   | 0.62          | 0.58                 | 0.64                  |
| Madagascar         | 3.75   | 0.64          | 0.74                 | 0.65                  |
| Venezuela          | 4      | 0.65          | 0.74                 | NULL                  |
Funcții pentru manipularea datelor în SQL Server

Să exersăm!

Funcții pentru manipularea datelor în SQL Server

Preparing Video For Download...