Přehled užitečných funkcí

Analyzing Business Data in SQL

Michel Semaan

Data Scientist

Práce s datumy

  • DATE_TRUNC('quarter', '2018-08-13')'2018-07-01 00:00:00+00:00'
  • '2018-07-01 00:00:00+00:00' :: DATE'2018-07-01'

Datumy v sestavách

  • Čitelné formáty data jsou v sestavách důležité
  • Výchozí formát '2018-08-13' není příliš přehledný
  • Jak převést '2018-08-13' na 'Friday 13, August 2018'?

Řešení

  • TO_CHAR('2018-08-13', 'FMDay DD, FMMonth YYYY')'Friday 13, August 2018'
Analyzing Business Data in SQL

TO_CHAR()

  • TO_CHAR(DATE, TEXT) → TEXT (formátovaný řetězec data)
  • Příklad: Dy → Zkrácený název dne (Mon, Tues, atd.)

    • TO_CHAR('2018-06-01', 'Dy') → 'Fri'
    • TO_CHAR('2018-06-02', 'Dy') → 'Sat'
  • Vzory ve formátovacím řetězci jsou nahrazeny odpovídající hodnotou data; ostatní znaky zůstávají beze změny

  • Příklad: DD → Číslo dne (01 - 31)
    • TO_CHAR('2018-06-01', 'Dy - DD') → 'Fri - 01'
    • TO_CHAR('2018-06-02', 'Dy - DD') → 'Sat - 02'
Analyzing Business Data in SQL
Vzor Popis
FMDay Celý název dne (Monday, Tuesday, atd.)
MM Měsíc v roce (01 - 12)
Mon Zkrácený název měsíce (Jan, Feb, atd.)
FMMonth Celý název měsíce (January, February, atd.)
YY Poslední 2 číslice roku (18, 19, atd.)
YYYY Celý čtyřciferný rok (2018, 2019, atd.)

Dokumentace: https://www.postgresql.org/docs/9.6/functions-formatting.html

Analyzing Business Data in SQL

Dotaz

SELECT DISTINCT
  order_date,
  TO_CHAR(order_date,
          'FMDay DD, FMMonth YYYY') AS format_1,
  TO_CHAR(order_date,
          'Dy DD Mon/YYYY') AS format_2
FROM orders
ORDER BY order_date ASC
LIMIT 3;

Výsledek

order_date  format_1                format_2       
----------  ----------------------  ---------------
2018-06-01  Friday 01, June 2018    Fri 01/Jun 2018
2018-06-02  Saturday 02, June 2018  Sat 02/Jun 2018
2018-06-02  Sunday 03, June 2018    Sun 03/Jun 2018
Analyzing Business Data in SQL

Okenní funkce znovu

  • SUM(...) OVER (...): Počítá průběžný součet sloupce
    • Příklad: SUM(registrations) OVER (ORDER BY registration_month) vypočítá průběžný součet registrací
  • LAG(...) OVER (...): Načítá hodnotu z předchozího řádku
    • Příklad: LAG(mau) OVER (ORDER BY active_month) vrátí aktivní uživatele (MAU) za předchozí měsíc
  • RANK() OVER (...): Přiřadí každému řádku pořadí na základě jeho pozice v seřazené sadě
    • Příklad: RANK() OVER (ORDER BY revenue DESC) seřadí uživatele, restaurace nebo měsíce podle vygenerovaných příjmů
Analyzing Business Data in SQL

Dotaz

SELECT
  user_id,
  SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id
ORDER BY revenue DESC
LIMIT 3;

Výsledek

user_id  revenue
-------  -------
18       626
76       553.25
73       537
Analyzing Business Data in SQL

Dotaz

WITH user_revenues AS (
  SELECT
    user_id,
    SUM(meal_price * order_quantity) AS revenue
  FROM meals
  JOIN orders ON meals.meal_id = orders.meal_id
  GROUP BY user_id)

SELECT
  user_id,
  RANK() OVER (ORDER BY revenue DESC)
    AS revenue_rank
FROM user_revenues
ORDER BY revenue_rank DESC
LIMIT 3;

Výsledek

user_id  revenue_rank
-------  ------------
18       1
76       2
73       3
Analyzing Business Data in SQL

Přehled užitečných funkcí

Analyzing Business Data in SQL

Preparing Video For Download...