Как получить уникальные пары элементов с одним и тем же идентификатором с помощью SQL

Исходная таблица выглядит следующим образом:

идентификатор сессии элемент 1 Футболка 1 брюки 1 шапка 2 пояс 2 обувь

Я хочу создать таблицу со всеми уникальными парами в одном и том же session_id (я хочу иметь возможность сделать это с помощью SQL или, что более предпочтительно, с помощью SQLAlchemy Python).

Ниже приведен пример таблицы, которую я хочу создать из приведенной выше таблицы примеров:

идентификатор сессии item_a item_b 1 Футболка брюки 1 Футболка шапка 1 брюки шапка 2 пояс обувь

Какие СУБД вы используете?

jarlh 07.02.2023 12:46

что ты уже испробовал? В какой части вы застряли?

matszwecja 07.02.2023 12:48

Добавьте новый идентификатор session_id только с одним элементом и соответствующим образом обновите ожидаемый результат.

jarlh 07.02.2023 12:49

@jarlh сейчас я использую sqlite. Тип создания фляжного приложения

3awny 07.02.2023 12:53

@jarlh не уверен, что ты имеешь в виду под своим вторым комментарием

3awny 07.02.2023 12:53

@matszwecja пока ничего, я не профессионал в sql

3awny 07.02.2023 12:54

Кроме того, вы действительно уверены, что это то, что вам нужно сделать? Такие пары не должны храниться в БД, это очень неэффективно с точки зрения хранения данных.

matszwecja 07.02.2023 12:54

@matszwecja, как лучше всего это хранить?

3awny 07.02.2023 12:55

@matszwecja это в основном используется для анализа правил ассоциации, я не вижу другого способа

3awny 07.02.2023 12:57

Трудно сказать, не зная вашего фактического варианта использования, но, скорее всего, вычисление его в реальном приложении из исходной таблицы было бы намного лучше. Допустим, у вас есть 20 элементов с одинаковым идентификатором сеанса. Это станет 190 парами, поэтому вы используете более чем в 9,5 раз больше места для хранения данных. И становится еще хуже, чем больше повторяющихся идентификаторов сеансов вы получаете. Это негативно влияет как на время отклика, так и на размер базы данных.

matszwecja 07.02.2023 13:01

@matszwecja, но мне нужна вторая таблица, чтобы знать, из какого session_id исходит определенная пара. Поскольку мне нужно получить больше информации об определенной паре из третьей таблицы, используя session_id. Поэтому, если я сделаю это в реальном приложении, я буду делать это каждый раз, когда пользователь нажимает на пару, что сделает его очень медленным.

3awny 07.02.2023 13:10

Вы должны быть в состоянии сделать это с помощью grouping across session_id, title, однако это вопрос ЕСЛИ вы должны, а не МОЖЕТЕ ли вы

ClearlyClueless 07.02.2023 13:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
12
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете выполнить самосоединение следующим образом:

select a.session_id,
       a.item item_a,
       b.item item_b
from table_name a join table_name b
on a.session_id = b.session_id
   and a.item > b.item
order by a.session_id, a.item 

Обратите внимание, что этот запрос не вернет ни одной строки для идентификаторов сеанса только с одним элементом.

Демо

как вы думаете, как лучше всего обрабатывать идентификаторы сеансов с помощью одного элемента?

3awny 07.02.2023 15:35

Добро пожаловать, что вы хотите показать в столбце item_b? Null или повторить значение item_a? или, может быть, значение по умолчанию.

ahmed 07.02.2023 16:01

Я хочу, чтобы это было Null

3awny 07.02.2023 16:38

Вы можете выполнить левое соединение и использовать функцию окна подсчета, проверьте это dbfiddle.uk/jmPk60Tm

ahmed 07.02.2023 17:18

Другие вопросы по теме