Если вы ищете что-то короткое и простое, возможно, этого вам будет достаточно:
class A(object):
def __init__(self, l):
self.data = l
def __iter__(self):
return iter(self.data)
пример использования:
In [3]: a = A([2,3,4])
In [4]: [i for i in a]
Out[4]: [2, 3, 4]
Поскольку у вас есть только 2 человека на домохозяйство, вы можете использовать этот трюк для получения минимального и максимального идентификатора клиента на домохозяйство. Это делается в подзапросе.
SELECT
X.HHID,
C1.FIRST_NAME AS I_FIRST_NAME, C1.LAST_NAME AS I_LAST_NAME,
C2.FIRST_NAME AS II_FIRST_NAME, C2.LAST_NAME AS II_LAST_NAME
FROM
(( SELECT
HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID)) AS MaxCId
FROM HouseHold_Client
GROUP BY HHID
) X
INNER JOIN Client AS C1
ON X.MinCId = C1.CID)
LEFT JOIN Client AS C2
ON X.MaxCId = C2.CID;
Цель выражения IIf()
- вывести максимальный идентификатор клиента только в том случае, если он отличается от минимального идентификатора клиента. Чтобы также вернуть запись, когда MaxCId
равно Null
, требуется LEFT JOIN
на C2
.
Я не присоединился к таблице HouseHold
здесь, так как нам нужна только HHID
из нее, которая также доступна в HouseHold_Client
. Вы также можете присоединиться к нему, если вам нужны другие столбцы из него.
Подзапрос:
( SELECT
HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID)) AS MaxCId
FROM HouseHold_Client
GROUP BY HHID
) X
Подзапросы должны быть заключены в круглые скобки и им должно быть присвоено имя (здесь X
). X
действует как обычная таблица, имеющая столбцы HHID
, MinCId
и MaxCId
в основном запросе. Он сгруппирован по HHID
. Т.е. он возвращает одну строку за HHID
. Min(CID)
возвращает наименьшее CID
и Max(CID)
наибольшее CID
за HHID
.
В случае, когда у вас есть 2 клиента на HHID
, это означает, что Min
и Max
дадут этих 2 клиентов. Если у вас есть только 1 клиент, то и Min
, и Max
вернут одного и того же клиента. Если это так, то IIf
вернет Null
вместо Max(CID)
, чтобы избежать двойного возврата одного и того же клиента.