L'opérateur DISTINCT¶
Lien : https://www.youtube.com/watch?v=bpRirgAiyhw&t=108s
Github le coin stat : https://github.com/LeCoinStat/LeCoinStat/tree/main/Bien_Debuter_SQL Fichiers Github récupérés : https://github.com/LeCoinStat/LeCoinStat/blob/main/Bien_Debuter_SQL/Jour1/CreationTable
Syntaxe :
SELECT DISTINCT nom_colonne FROM nom_table;
In [1]:
import duckdb
import polars as pl
from skimpy import skim
In [2]:
# Connection à la librairie duckdb
conn = duckdb.connect()
Fichier des ventes¶
In [3]:
# Requête SQL : récupération de toutes les données du fichier .csv en DF
sales_df = conn.execute(
"""
SELECT *
FROM read_csv_auto('data/indexE/Ventes.csv', header=True);
"""
).df()
In [4]:
# Stats de la DF
skim(sales_df)
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ Dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 100 │ │ int64 │ 5 │ │ │ │ Number of columns │ 7 │ │ datetime64 │ 1 │ │ │ └───────────────────┴────────┘ │ float64 │ 1 │ │ │ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓ │ │ ┃ column ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p50 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩ │ │ │ VenteID │ 0 │ 0 │ 50.5 │ 29.01 │ 1 │ 25.75 │ 50.5 │ 75.25 │ 100 │ ▇▇▇▇▇▇ │ │ │ │ ClientID │ 0 │ 0 │ 51.26 │ 29.18 │ 1 │ 27.75 │ 53.5 │ 77.25 │ 99 │ ▆▇▅▇▆▇ │ │ │ │ EmployeID │ 0 │ 0 │ 50.65 │ 29.4 │ 2 │ 23 │ 49.5 │ 76.25 │ 100 │ ▇▇▇▆▇▇ │ │ │ │ ProduitID │ 0 │ 0 │ 48.08 │ 24.56 │ 3 │ 29 │ 46 │ 65.25 │ 98 │ ▅▆▇▇▅▃ │ │ │ │ QuantiteVendue │ 0 │ 0 │ 48.36 │ 30.17 │ 1 │ 22 │ 50.5 │ 71 │ 100 │ ▇▇▃▇▃▇ │ │ │ │ MontantTotal │ 0 │ 0 │ 8278 │ 11580 │ 59.98 │ 1542 │ 2979 │ 9249 │ 48500 │ ▇▁▁ ▁ │ │ │ └────────────────────┴─────┴────────┴─────────┴────────┴────────┴────────┴───────┴────────┴────────┴─────────┘ │ │ datetime │ │ ┏━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓ │ │ ┃ column ┃ NA ┃ NA % ┃ first ┃ last ┃ frequency ┃ │ │ ┡━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩ │ │ │ DateVente │ 0 │ 0 │ 2020-01-08 12:43:33 │ 2023-12-27 15:39:42 │ None │ │ │ └────────────────┴──────┴─────────┴─────────────────────────────┴─────────────────────────────┴──────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
In [5]:
# Enregistrement de la DF ci-avant en BD virtuelle (SQL : VIEW)
conn.register("sales_db", sales_df)
Out[5]:
<_duckdb.DuckDBPyConnection at 0x28a91da5370>
Fichier des employés¶
In [6]:
# Récupération de toutes les données du fichier .csv en DF
employees_df = conn.execute(
"""
SELECT *
FROM read_csv_auto('data/indexE/Employes.csv', header=True);
"""
).df()
In [7]:
# Stats de la DF
skim(employees_df)
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ Dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 100 │ │ string │ 5 │ │ │ │ Number of columns │ 6 │ │ int64 │ 1 │ │ │ └───────────────────┴────────┘ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓ │ │ ┃ column ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p50 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩ │ │ │ EmployeID │ 0 │ 0 │ 50.5 │ 29.01 │ 1 │ 25.75 │ 50.5 │ 75.25 │ 100 │ ▇▇▇▇▇▇ │ │ │ └───────────────┴──────┴─────────┴────────┴──────────┴──────┴──────────┴────────┴─────────┴────────┴─────────┘ │ │ string │ │ ┏━━━━━━━━━━━┳━━━━┳━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┓ │ │ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ chars per ┃ words per ┃ total ┃ │ │ ┃ column ┃ NA ┃ NA % ┃ shortest ┃ longest ┃ min ┃ max ┃ row ┃ row ┃ words ┃ │ │ ┡━━━━━━━━━━━╇━━━━╇━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━┩ │ │ │ Nom │ 0 │ 0 │ Liu │ Mccormick │ Adams │ Woods │ 5.94 │ 1 │ 100 │ │ │ │ Prenom │ 0 │ 0 │ Mr. │ Christoph │ Adrian │ William │ 6.29 │ 1 │ 100 │ │ │ │ │ │ │ │ er │ │ │ │ │ │ │ │ │ Fonction │ 0 │ 0 │ Consultan │ Customer │ Account │ Software │ 18.8 │ 2.1 │ 207 │ │ │ │ │ │ │ t │ Service │ Manager │ Developer │ │ │ │ │ │ │ │ │ │ │ Represent │ │ │ │ │ │ │ │ │ │ │ │ │ ative │ │ │ │ │ │ │ │ │ Email │ 0 │ 0 │ lee.gary@ │ marshall. │ adams.ken │ woods.all │ 23.2 │ 1 │ 100 │ │ │ │ │ │ │ gmail.com │ christoph │ neth@gmai │ en@gmail. │ │ │ │ │ │ │ │ │ │ │ er@gmail. │ l.com │ com │ │ │ │ │ │ │ │ │ │ │ com │ │ │ │ │ │ │ │ │ NumeroTel │ 0 │ 0 │ 086008428 │ 086008428 │ 000440609 │ 099825623 │ 10 │ 1 │ 100 │ │ │ │ ephone │ │ │ 1 │ 1 │ 4 │ 2 │ │ │ │ │ │ └───────────┴────┴──────┴───────────┴───────────┴───────────┴───────────┴───────────┴───────────┴────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
In [8]:
# Enregistrement de la DF ci-avant en BD virtuelle (SQL : VIEW)
conn.register("employees_db", employees_df)
Out[8]:
<_duckdb.DuckDBPyConnection at 0x28a91da5370>
Requêtes SQL¶
Donner les différentes dates auxquelles des ventes ont été réalisées
In [9]:
df = conn.execute(
"""
-- Colonnes récupérées
SELECT DISTINCT("DateVente") AS "Date des ventes"
-- BD récupérée
FROM sales_db
-- Trie
ORDER BY "Date des ventes" ASC;
"""
).df()
In [10]:
# Affichage des 5 premières lignes de la DF pandas
df.head()
Out[10]:
| Date des ventes | |
|---|---|
| 0 | 2020-01-08 12:43:33 |
| 1 | 2020-01-22 12:12:56 |
| 2 | 2020-02-02 10:34:59 |
| 3 | 2020-02-11 18:54:15 |
| 4 | 2020-02-29 16:46:17 |
In [11]:
# Conversion en df polars avec conversion champ date en str
pl.from_pandas(df["Date des ventes"].dt.strftime('%d/%m/%Y'))
Out[11]:
shape: (100,)
| Date des ventes |
|---|
| str |
| "08/01/2020" |
| "22/01/2020" |
| "02/02/2020" |
| "11/02/2020" |
| "29/02/2020" |
| … |
| "10/10/2023" |
| "16/10/2023" |
| "04/11/2023" |
| "19/11/2023" |
| "27/12/2023" |
Donner les noms et prénoms distincts des employés de l'entreprise
In [14]:
conn.execute(
"""
-- Récupération des colonnes
SELECT
DISTINCT(Nom)
, Prenom
-- BD récupérée
FROM employees_db
-- Trie
ORDER BY
Nom
, Prenom;
"""
).df()
Out[14]:
| Nom | Prenom | |
|---|---|---|
| 0 | Adams | Kenneth |
| 1 | Adams | Mary |
| 2 | Adams | William |
| 3 | Anderson | Jessica |
| 4 | Ball | Alyssa |
| ... | ... | ... |
| 95 | West | Natasha |
| 96 | Willis | Teresa |
| 97 | Wilson | Heidi |
| 98 | Wilson | Kathy |
| 99 | Woods | Allen |
100 rows × 2 columns