Похоже, вам нужна функциональность, такая как группировка по операции. Лучше всего преобразовать его в фрейм данных pandas, а затем создать группу.
import pandas as pd
a = [[0, 1, 0], [1, 2, 1], [2, 2, 1],
[3, 0, 0], [4, 0, 1], [5, 1, 2],
[6, 0, 1], [7, 1, 0], [8, 1, 2]]
df = pd.DataFrame(a, columns =['index', 'x', 'y'])
grouped_df = df.groupby(['x', 'y']).aggregate(lambda x: tuple(x)).reset_index()
print(grouped_df)
Выход:
x y index
0 0 0 (3,)
1 0 1 (4, 6)
2 1 0 (0, 7)
3 1 2 (5, 8)
4 2 1 (1, 2)
Я не использую ИСПОЛЬЗОВАНИЕ синтаксиса с тех пор
т.е. принятие 3 таблиц с 'идентификатором' и 'id_2' столбцами, делает
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
стать
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
или
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
или что-то еще снова?
Обнаружение этого для конкретной версии базы данных является довольно тривиальным осуществлением, но у меня нет большой суммы уверенности, что это последовательно через все базы данных, и я не единственный человек, который должен поддержать мой код (таким образом, другие люди должны будут также знать о том, что это эквивалентно).
Заметное отличие для, ГДЕ по сравнению с НА то, если объединение является внешним:
Принимая T1 с единственным полем ID, одной строкой, содержащей значение 1, и T2 с полем ID и VALUE (одна строка, ID=1, VALUE=6), затем, мы добираемся:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
не дает строк, начиная с, ГДЕ требуется, чтобы соответствовать, тогда как
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
даст одну строку со значениями
1, NULL, NULL
начиная с НА только требуется для соответствия соединению, которое является дополнительным из-за того, чтобы быть внешним.
USING
пункт является сокращением от объединения по эквивалентности столбцов, предполагая, что столбцы существуют в обеих таблицах тем же именем:
A JOIN B USING (column1)
A JOIN B ON A.column1=B.column1
Можно также назвать несколько столбцов, который делает соединения на первичных ключах довольно простыми. Следующие соединения должны быть эквивалентными:
A JOIN B USING (column1, column2)
A JOIN B ON A.column1=B.column1 AND A.column2=B.column2
Отметьте это USING (<columnlist>)
требуется, чтобы иметь круглые скобки, тогда как ON <expr>
не требуется, чтобы иметь круглые скобки (хотя parens может использоваться вокруг <expr>
просто они могут быть включены вокруг выражения в любом другом контексте).
Кроме того, никакие другие таблицы не участвовали в запросе, может иметь столбец тем именем, или иначе запрос неоднозначен, и необходимо получить ошибку.
Относительно Вас вопрос о дополнительных условиях, принимая Вас используют INNER JOIN
это должно логически дать тот же результат запроса, но план оптимизации может быть затронут, в зависимости от реализации RDBMS. Также OUTER JOIN
дает другой результат, если Вы включаете условия в соединение по сравнению с WHERE
пункт.
Я полагаю, что Вы корректны - ИСПОЛЬЗУЯ (xx), стенография для присоединения на двух столбцах с идентичными именами.
Что касается второго вопроса, оба запроса могли быть тем же или могут отличаться в зависимости от реализации планировщика запроса, характерной для базы данных. Для обнаружения для себя (по крайней мере, в пост-ГРЭС) делают ОБЪЯСНИТЬ ВЫБОР..., чтобы видеть, как планы запросов будут выполняться.
Ваша интерпретация кажется корректной. Эта статья может помочь.
Что касается второго вопроса, я не вижу, почему результат Вашего третьего примера должен отличаться от того из первых двух. Любое условие в 'НА' пункте имеет то же значение, как будто это было в 'ГДЕ' пункт.
Если существует только одно соединение затем нет никакого различия.
Оборотная сторона к пункту использования является оба таблицами, должен иметь то же имя столбца.