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