Функция distinct
Функция distinct применяет к запросу
оператор DISTINCT, который удаляет
дублирующиеся строки из результата выборки.
Функция не принимает обязательных параметров
и может вызываться как без аргументов, так и
с выражением, по которому нужно проверять
уникальность. Чаще всего distinct
используется в связке с методом select
для построения SQL-запросов.
Синтаксис
select(...).distinct()
select(distinct(column))
Пример
Давайте создадим таблицу articles,
заполним ее данными с повторяющимися
значениями и применим distinct
к колонке status:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 2', 'status': 'draft'},
{'id': 3, 'title': 'article 3', 'status': 'published'},
{'id': 4, 'title': 'article 4', 'status': 'draft'},
])
res = conn.execute(
select(articles.c.status).distinct()
)
for row in res:
print(row)
Результат выполнения кода:
('published',)
('draft',)
Пример
Давайте посмотрим итоговый SQL-запрос,
который строит SQLAlchemy при вызове
distinct:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
query = select(articles.c.status).distinct()
print(query)
Итоговый SQL запрос:
SELECT DISTINCT articles.status
FROM articles
Пример
Давайте применим distinct
к нескольким колонкам сразу и посчитаем
уникальные комбинации значений:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 1', 'status': 'published'},
{'id': 3, 'title': 'article 2', 'status': 'draft'},
{'id': 4, 'title': 'article 2', 'status': 'draft'},
])
res = conn.execute(
select(articles.c.title, articles.c.status).distinct()
)
for row in res:
print(row)
Результат выполнения кода:
('article 1', 'published')
('article 2', 'draft')
Смотрите также
-
функцию
func.count,
которая считает количество строк в выборке -
функцию
asc,
которая задает сортировку по возрастанию -
функцию
desc,
которая задает сортировку по убыванию -
функцию
label,
которая задает псевдоним для колонки результата